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

C++ 试图访问std::string的索引-1处的字符的行为?,c++,string,C++,String,试图访问std::string中-1处的字符是否有任何行为保证 如果我这样做: for (int i = 0; i < str.size(); i++) { if (str[i-1] == 'a' && str[i+1] == 'c') { //etc } } for(int i=0;i

试图访问std::string中
-1
处的字符是否有任何行为保证

如果我这样做:

for (int i = 0; i < str.size(); i++) {
  if (str[i-1] == 'a' && str[i+1] == 'c') {
    //etc
  }
}
for(int i=0;i
然后在第一次迭代时,它将执行
str[-1]
,标准说会发生什么?我知道它在C++11中说str[str.size()]将返回空字符,但是像cppreference和cplusplus这样的站点没有提到任何关于其他越界访问的内容


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

引自c++11标准:

[string.access]

常量参考运算符[](大小类型位置)常量; 参考运算符[](尺寸类型pos)

需要:pos 在std::string中访问字符at-1有任何保证行为吗

从形式上讲,这要看情况。实际上,这是一种未定义的行为,因此没有任何保证

运算符[]
的参数是无符号的,因此
-1
是类型可以保存的最大值(
std::numeric\u limits::max()
)。由于这也是
std::string::size()
可以容纳的最大值,因此只有在字符串具有允许的最大大小的情况下(极不可能),才能很好地定义它,在这种情况下,返回对空终止符的引用

根据C++11标准和C++14标准的N3936草案

21.4.5基本字符串元素访问[string.access]

const_reference operator[](size_type pos) const;
reference       operator[](size_type pos);

  • 要求:
    pos“是否有任何保证的行为…”不,这是未定义的行为,任何事情都可能发生。到处都是鼻魔。您是在询问越界访问,还是专门询问
    -1
    会发生什么情况?确切地说是-1,但也大于.size()@Jonathan-在-1处没有字符,因此,在你的标题和开场白中询问“在…-1处的字符”是没有意义的。这里的“否则”不是指“如果pos大于字符串长度”吗?乍一看,-1似乎小于字符串长度。在你的答案中加上-1被转换为unsigned。你引用了哪些文档?在C++11中,要求是
    pos,因为您似乎有不完整的草稿。在我的例子中,它表示1需要:pos是的,我将其更改为我的最后一个std语句。它是正式定义的,而不是C++11中未定义的行为。我不确定标准是否允许使用-1有效索引
    std::string::size_type(-1)
    也是
    std::string::npos
    的一个值,它在许多函数中具有特殊意义,并出现在许多前置/后置条件中(通常以
    …=npos
    的形式出现)。所以它可能与本例中的某些内容相冲突。@Revolver_Ocelot就运算符[]而言,就像我在这里说的那样。@Jean BaptisteYunès如果
    pos
    大于
    size()
    ,则定义为未定义的行为。在大多数现实场景中都是这样,因为人们不太可能真正构造一个尽可能大的字符串。@juanchopanza那么我引用的c++11标准的话呢?