一段时间以来,我一直想知道std::string
的substr(pos, len)
方法设计背后的原理。这对我来说仍然没有意义,所以我决定请教专家。std::out_of_range
如果pos
参数超过字符串长度加一,则该函数将引发异常。有时这可能会带来不便(甚至烦人),但我真正关心的是一致性和最少惊讶的原则。事实证明,pos+len
子字符串的“结束”位置可以超过字符串长度加一。我从一开始就不允许这样做,但到最后都不允许这样做。最后允许我暗示了这种解释
返回位置上的所有字符 pos <= i < pos+len
但是,我希望该函数返回一个空字符串,以获取pos
超出字符串长度的值,而不是引发异常。附带说明一下,使用这种解释,甚至允许使用负值pos
(假设它具有带符号的类型)甚至是明智的。
这给我留下了以下问题:
std::string
它不是以Null结尾的,而是跟踪字符串的长度。如果这是真正的原因,那么我个人认为那是一个非常糟糕的原因。substr
未来的行为?我猜不是,因为静默地破坏现有代码肯定比忍受这种扭曲……还糟。这个问题的确是基于观点的,但是我将尝试一点一点地回答它。
strncmp
样式化的函数,但是通过这样的设计,您只需为len
参数传递缓冲区长度,它就可以正常工作。但是,如果您尝试访问位于字符串边界之外的子字符串,那么您可能会错过一些简单的健全性检查。和的内部实现std::string
无关紧要。pos
超出的抛出异常size()
,因此很可能没有。我的观点是:此异常(尽管我不愿使用这些异常)使您可以注意到缺少一些基本完整性检查的代码,例如访问缓冲区边界之外的代码。相似at()
的功能和许多其他功能都使用了相同的设计。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句