C++容器的迭代器失效规则是什么?
优选地以摘要列表格式.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我想使用实际指针地址(未标记为volatile)来对象进行唯一标识.
这是一件坏事吗?一般来说,系统内存管理会移动对象,因此它的地址是关于指针还是指针稳定?
谢谢
我找不到标准中指针/引用失效的任何定义.我问,因为我发现C++ 11禁止字符串的写时复制(COW).据我所知,如果应用了COW,那么在以下命令之后p仍然是一个有效的指针和r一个有效的引用:
std::string s("abc");
std::string s2(s);
char * p = &(s2[0]);
char & r = s2[0];
s2[1] = "B";
Run Code Online (Sandbox Code Playgroud)
只是他们不再指向/引用第一个字符s2,而只是指向第一个字符s.
在C++ 11标准中,据说非常量std::basic_string::operator[]可能不会使字符串元素的指针/引用(以及迭代器)无效.
哪些规则说上面显示的例子实际上会失效p,r如果实施了COW?
c++ ×3
pointers ×2
c ×1
c++-faq ×1
c++11 ×1
c++17 ×1
invalidation ×1
iterator ×1
objective-c ×1
reference ×1