[英]The behavior of std::advance at the end of std::list
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> A;
A.push_back(1);
A.push_back(2);
A.push_back(3);
auto it = A.begin();
cout << *it << ' ';
advance(it, 1);
cout << *it << ' ';
advance(it, 1);
cout << *it << ' ';
advance(it, 1);
cout << *it << ' ';
advance(it, 1);
cout << *it << ' ';
}
我相信該list
是一個雙向鏈表。 令人驚訝的是,output 是1 2 3 3 1
。 有人可以解釋這里發生了什么嗎? 以下是問題:
3
的節點。 在這里,一個額外的advance
將迭代器移動到A.end()
。 我相信A.end()
是一個不指向原始元素的虛構節點。 但是,它打印出3
。 為什么?1
呢? 該list
不是循環隊列。取消引用結束迭代器是未定義的。 結束迭代器指向列表中的最后一個元素。 它不引用列表中的元素,因為沒有元素超過最后一個。
進一步推進結束迭代器也是未定義的。
您的程序有未定義的行為。
未定義的行為意味着任何事情都可能發生。 沒有未定義行為的代碼的運行時行為在語言標准中指定(有些是實現定義的或未指定的,但讓我們保持簡單)。 另一方面,當您的代碼具有未定義的行為時,您無法保證最終的程序運行時行為是什么。 您的 output 可能是"Hello World"
。
當然,output 不是"Hello World"
,您看到 output 是有原因的。 但是,這些原因與 C++ 的工作原理無關。 要了解為什么會得到 output,您必須研究編譯器生成的程序集。 最終要了解編譯器為何生成此程序集,您需要研究編譯器的實現細節。 但是,如果您想了解 C++,那么這些都是徒勞的,您需要知道的是您的代碼具有未定義的行為。
我測試了這個程序,它崩潰了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.