【发布时间】:2020-08-25 21:07:36
【问题描述】:
我试图弄清楚为什么取消引用空列表迭代器会阻止其余代码运行。注释掉该行,一切看起来都很好,但是将其保留下来,程序似乎并没有超过这一点。
我想这应该是一个错误,因为列表是空的,但我没有收到任何警告或错误。
我在 MinGW 中使用代码块
std::list<std::string> slist;
std::string word;
auto iter = slist.begin();
//what is this doing?
std::cout << (*iter) << std::endl;
while(std::cin >> word)
{
iter = slist.insert(iter, word);
}
slist.insert(slist.begin(), {"foo", "bar"});
for(auto item: slist)
std::cout << item << std::endl;
【问题讨论】:
-
这是未定义的行为。任何事情都有可能发生。
-
但我没有收到任何警告或错误。 -- 也许在具有迭代器检查的调试版本中,例如 Visual Studio,您会收到错误消息。但除此之外,C++ 不会检查并且行为未定义。
-
如果
slist是一个空列表,它的begin()迭代器等价于end()迭代器。取消引用结束迭代器(更好地命名为“结束”)会产生未定义的行为。list是一种库类型,因此编译器无法预测其在运行时确定的行为(例如其内容是什么)。 -
en.cppreference.com/w/cpp/language/ub 也阅读了底部链接的文章。