我在标准中找不到关于指针/引用无效的任何定义。我问是因为我刚刚发现 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";
只是他们不再指向/引用s2
的第一个字符,而只是指向s
的第一个字符。
在 C++11 标准中,据说非常量 std::basic_string::operator[]
可能不会使指向字符串元素的指针/引用(以及迭代器)无效。
如果实现 COW,哪些规则表明上面显示的示例实际上会使 p
和 r
无效?
最佳答案
标准中没有“invalidation”的定义,因为这个词是从英文继承过来的。这意味着它在英语中的含义:无效的引用/指针不再有效。无法使用。
但是,有些地方明确指出了此限制条件。例如,将指针左值转换为右值时(在表达式求值期间发生):
[conv.lval/2]
Otherwise, if the object to which the glvalue refers contains an invalid pointer value (3.7.4.2, 3.7.4.3), the behavior is implementation-defined
我现在找不到引用的措辞,但无论如何不言自明,你不能使用对不再存在的东西的引用。
关于c++ - 引用/指针失效到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748529/