究竟什么是引用/指针的失效?

Dan*_*ica 5 c++ pointers reference invalidation language-lawyer

我找不到标准中指针/引用失效的任何定义.我问,因为我发现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?

Lig*_*ica 6

标准中没有"无效"的定义,因为该术语是继承自英语.这意味着它在英语中意味着什么:无效的引用/指针不再有效.它不能使用.

但是,有一些地方明确指出了这种约束.例如,将指针左值转换为右值(在评估表达式时发生):

[conv.lval/2] 否则,如果glvalue引用的对象包含无效指针值(3.7.4.2,3.7.4.3),则行为是实现定义的

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

  • @DanielLangr你说它存在,但实现不保证给你.这就是失效的意思.与C++中的任何其他"可能是,可能不是"场景相同.建议您编写合同而不是机会.一致认为,在某些情况下,您可以确切地知道实际上仍然存在无效对象.然而,这种情况通常是人为的,并不指导一般情况. (3认同)