迭代但不解除引用C++中的无效迭代器

new*_*bie 2 c++ visual-c++

当使用Visual C++编译器在调试模式下编译时,此代码调用一个断言.

std::vector<int> test;
++test.begin();
Run Code Online (Sandbox Code Playgroud)

该计划说:

Debug Assertion Failed!

...

Expression: vector iterator not incrementable.
Run Code Online (Sandbox Code Playgroud)

至于我,这段代码是完全合法的,因为我不打算取消引用迭代器.问题是:标准是否未定义(或可能是实现定义)此行为?

Bil*_*nch 8

基本上,你不能接受container.end()并增加它.

在这种情况下,因为你有一个空容器container.begin() == container.end(),所以你也不能增加begin().

您可以在C++ 2011表107中找到对此的引用.它基本上表示++iterator只有在iterator可解除引用时才有效.

C++ 2011表107的一部分

所以这是合法的未定义行为.

  • @newbie:无效指针上的算术也是未定义的行为.它不太可能导致明显的错误,因为大多数处理器将指针视为数值,除非您取消引用它们,否则不会捕获无效指针. (4认同)