为什么 std::string::substr 会抛出异常而不是返回空字符串
Why does std::string::substr throw an exception instead of returning an empty string?
我一直
在想std::string
的substr(pos, len)
方法设计背后的原理。这对我来说仍然没有意义,所以我决定问专家。如果 pos
参数超过字符串长度加 1,则该函数将引发std::out_of_range
异常。这有时会很不方便(甚至烦人),但我真正关心的是一致性和最小意外原则。事实证明,子字符串的"结束"位置pos+len
允许超过字符串长度加一。一开始就不允许这样做,但不允许结束,这对我来说是不一致的。允许它结束对我来说暗示了解释
返回位置pos <= i < pos+len
的所有字符
但是,我希望该函数为超过 pos
字符串长度的值返回一个空字符串,而不是抛出异常。作为旁注,通过这种解释,甚至允许负值pos
也是明智的(前提是它具有有符号类型)。
这给我留下了以下问题:
- 这种设计对您来说是否合乎逻辑?懂事?您是否有令人满意的方法来解决不一致?我能想出的唯一可能的解释是与以 null 结尾的字符串的兼容性。对于空终止,指定的长度是否超过结束并不重要,而超出空字符的开始是一个内存错误。但是,
std::string
不是以 null 结尾的,而是跟踪字符串的长度。如果这是真正的原因,那么我个人会称之为非常糟糕的原因。 - 在性能方面是否有优势?我实际上会感到惊讶。
- 我是否忽略了可用性方面的优势?也许是一个标准的成语或用例与其他功能相结合,比如 find?同样在这里,我的印象是返回空字符串有可能简化一些代码。
- 将来有什么办法可以改变
substr
的行为吗?我想不会,因为默默地破坏现有代码一定比忍受这种扭曲更糟糕......?
这个问题
真的太基于意见了,但我会尝试逐点回答。
- 这种设计对您来说是否合乎逻辑?懂事?这对我来说似乎是合乎逻辑的。也许这样的意见来自
strncmp
样式的函数,但是通过这样的设计,您只需传递len
参数的缓冲区长度,它就可以正常工作。但是,如果您尝试访问位于字符串边界之外的子字符串,那么您可能会错过一些简单的健全性检查。std::string
的内部实现并不重要。 - 在性能方面是否有优势?我认为这不是原因。
- 我是否忽略了可用性方面的优势?也许,看看第1点。
- 将来有什么方法可以改变substr的行为吗?在超过
size()
pos
时抛出异常在标准中定义,因此很可能没有。
的观点是:这个例外(尽管我宁愿从不使用这些例外)允许您注意到缺少一些基本健全性检查的代码,例如在其边界之外访问缓冲区。相同的设计用于类似at()
的功能和许多其他功能。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 字符串返回字符串的整数/双精度/长整型值
- 如何从COM模块中的函数返回字符串数组?
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 我如何在函数 cpp 中返回字符串
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 格式化返回字符串C++
- 返回字符串vs通过引用传递字符串以更新值
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 从 C++ 中的模板函数返回字符串和整数
- 返回字符串的散点回文计数
- C++重载字符串 [] 运算符以返回字符串和
- 返回字符串和不同向量数据类型的映射C++
- 字符串函数不返回字符串? C++
- 从函数返回字符串C++错误
- 如何在返回字符串的函数中不忽略void值
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- C - 返回字符串时的分割故障
- 使用向量和字符串函数返回字符串