尝试访问std :: string的索引-1处的字符的行为?

时间:2016-09-02 09:41:00

标签: c++ string

在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这样的网站不会对其他超出范围的访问说些什么。

(如果我运行上面的代码,那么没有什么不好的事情发生,但我想确保这是标准的)

2 个答案:

答案 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);
     
      
  1. 需要:pos <= size()
  2.   
  3. 如果*(begin() + pos),则返回pos < size()。否则,返回对值为charT的{​​{1}}类型的对象的引用,其中   修改对象会导致未定义的行为。 ....
  4.   

答案 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查找。