在std :: string中尝试访问-1
处的字符是否有任何保证的行为?
例如,如果我这样做:
for (int i = 0; i < str.size(); i++) {
if (str[i-1] == 'a' && str[i+1] == 'c') {
//etc
}
}
然后在第一次迭代时它会str[-1]
,标准会说会发生什么?我知道它在C ++ 11中说str [str.size()]将返回空字符,但是像cppreference和cplusplus这样的网站不会对其他超出范围的访问说些什么。
(如果我运行上面的代码,那么没有什么不好的事情发生,但我想确保这是标准的)
答案 0 :(得分:1)
是否有任何保证行为可以在std :: string中访问-1处的字符?
正式来说,这取决于。实际上,它是未定义的行为,所以没有保证。
operator[]
的参数是无符号的,因此-1
是类型可容纳的最大值(std::numeric_limits<std::string::size_type>::max()
)。由于这也是std::string::size()
可以容纳的最大值,因此在(极不可能的)情况下,字符串具有允许的最大大小,可以很好地定义 ,在这种情况下引用返回null终止符。
来自C ++ 11标准,以及C ++ 14标准的N3936草案,
21.4.5 basic_string元素访问[string.access]
const_reference operator[](size_type pos) const; reference operator[](size_type pos);
- 需要:
pos <= size()
。- 如果
醇>*(begin() + pos)
,则返回pos < size()
。否则,返回对值为charT
的{{1}}类型的对象的引用,其中 修改对象会导致未定义的行为。 ....
答案 1 :(得分:-1)
引自c ++ 11标准:
[string.access]
const_reference运算符[](size_type pos)const; reference operator [](size_type pos);
需要:pos&lt; = size()。否则,返回对charT类型的对象的引用,其值为charT(),其中修改对象会导致未定义的行为。
投掷:没什么。
复杂性:恒定时间
如果pos&lt;返回:*(begin()+ pos)尺寸()。
您的-1将转换为无符号size_type
,从而产生该类型的最大值。
然后它应该返回一个nul char。
注意:我的clang没有这种行为,并在其文档中说明,未选中使用此运算符的数据访问,并且未定义out_of_range查找。