取消引用一个超出范围的矢量迭代器 - 什么是开心的,为什么?

Eri*_*ika 2 c++ iterator vector

在我的设置上运行:

  vector<int> myvector;
  for (int i=1; i<=5; i++) myvector.insert(myvector.end(),i);

  vector<int>::iterator it;
  for ( it=myvector.begin() ; it < myvector.end()+2; it++ )
    cout << " " << *it;
Run Code Online (Sandbox Code Playgroud)

产量:

1 2 3 4 5 0 0

我原本以为尝试取消引用超出范围的迭代器会导致段错误.但它似乎产生了向量中包含的类型的空或默认初始化对象.

这是明确定义的行为吗?这个属性来自迭代器还是来自向量?迭代器在某种意义上是否会捕获超出范围的异常,而是返回一个空对象?

我尝试在C++ 11参考中找到这个,但感觉它有点过头了.

Sin*_*all 7

这是未定义的行为,这意味着任何事情都可能发生,包括段错误,或您经历过的事情或其他任何事情.基本上,你很幸运它没有崩溃(或根据观点不吉利).