标准引用:超出范围调用`vector :: operator []`是否会调用未定义的行为?

Joh*_*ing 2 c++ language-lawyer c++11

考虑:

#include <vector>

int main()
{
  std::vector <int> v;
  v.reserve (100);
  v[1] = 42;
}
Run Code Online (Sandbox Code Playgroud)

我知道上面的代码调用了未定义的行为,因为在调用站点v[1],根据的向量大小v.size()是<1.(它是零.)

但是,我花了大约一小时左右的时间来查看C++标准,以便直接或间接地澄清这实际上是未定义的行为.

也许我错过了显而易见的事.你能提供至少C++ 03以及可选的C++ 11标准的引用或引用吗?

Nic*_*las 11

这是如何operator[]界定的产物.在§23.2.3[sequence.rqmts]表101中,操作语义operator[]被定义为*(a.begin() + n).所以它是根据迭代器定义的.根据§24.2.1/ 5 [iterator.requirements.general] ,递增begin过去end和取消引用它是未定义的行为.

  • @JohnDibling:我看不出它们是什么样的*但是*规范性的.它们描述了这些表达式的行为方式,并且在其他任何地方都没有描述. (2认同)