Kar*_*oll 9 c++ iterator undefined-behavior move-semantics c++11
考虑以下程序:
struct list_wrapper
{
std::vector<int> m_list;
};
int main()
{
std::vector<int> myList { 1, 1, 2, 3, 5 };
const std::vector<int>::iterator iter = myList.begin();
list_wrapper wrappedList;
wrappedList.m_list = std::move(myList);
// Can I still dereference iter?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调用之后std::move(myList),iter现在指向内部的有效项wrappedList.m_list,或者移动构造函数/赋值使所有迭代器无效?
在http://en.cppreference.com注意后(强调我的):
在容器移动赋值(overload(2))之后,除非元素移动赋值由不兼容的分配器强制执行,引用,指针和迭代器(除了结束迭代器)仍然有效,但引用现在在*this中的元素.当前标准通过§23.2.1[container.requirements.general]/12中的一揽子声明进行此保证,并且正在通过LWG 2321考虑更直接的保证.
笔记
正如hvd正确地指出的那样,至少有一种情况是移动分配器被迫使迭代器失效 - 当新容器具有不兼容的分配器时.
正如Ben Voigt所指出的那样,这个主题在这里有更广泛的讨论,它实际上已经涵盖了问题的c ++ 11方面......