2015-03-31 77 views
2

此代碼在調試模式下使用Visual C++編譯器編譯時調用一個斷言。在C++中迭代但不是取消引用無效迭代器

std::vector<int> test; 
++test.begin(); 

節目說:

Debug Assertion Failed! 

... 

Expression: vector iterator not incrementable. 

對我來說,這個代碼是完全合法的,因爲我不打算取消引用的迭代器。問題是:這個行爲是否由The Standard未定義(或者可能是實現定義),或者不是?

回答

8

基本上,你不允許採取container.end()並增加它。

在這種情況下,因爲您有一個空容器container.begin() == container.end(),所以您也不能增加begin()

你可以在C++ 2011表107找到這篇文章的引文。它基本上說++iterator只有在iterator是可解引用的時候纔有效。

A portion of C++ 2011 Table 107

因此,這是合法的未定義的行爲。

+0

但是我們被允許做一個無效指針,直到它不會被解除引用。這是明確的行爲。 – newbie 2015-03-31 14:26:20

+0

@newbie:迭代器不一定是一個簡單的指針。 – 2015-03-31 14:27:15

+0

我明白了。我評論你的第一個答案。引文解釋了一切,謝謝。 – newbie 2015-03-31 14:29:49