reference/pointer 的失效到底是什么?

What exactly is invalidation of reference/pointer?

我在标准中找不到 pointers/references 无效的任何定义。我问是因为我刚刚发现 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";

只是他们不再point/refer到s2的第一个字符,而只是s的第一个字符。

在 C++11 标准中,据说非常量 std::basic_string::operator[] 可能不会使 pointers/references(以及迭代器)对字符串元素无效。

如果实施 COW,哪些规则表明上面显示的示例实际上会使 pr 无效?

例如:

std::string * p_s(new ::std::string("abc"));
std::string s2(*p_s); // shares buffer with p_s
char const & ch1(static_cast<::std::string const &>(*p_s)[0]);
char const & ch2(static_cast<::std::string const &>(s2)[0]); // same as ch1
// CoW, ch2 becomes invalid, but is backed by p_s buffer
char & ch(static_cast<::std::string &>(s2)[0]); // backed by new buffer
// both ch1 and ch2 become invalid
delete p_s;

标准中没有"invalidation"的定义,因为该术语是从英语继承而来的。这意味着它在英语中的含义:无效的 reference/pointer 不再有效。无法使用。

但是,在某些地方明确指出了此限制。例如,当将指针左值转换为右值时(在表达式求值期间发生):

[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

我现在找不到引用的措辞,但无论如何不言自明,你不能使用对不再存在的东西的引用。