c++ - 引用/指针失效到底是什么?

标签 c++ pointers reference language-lawyer invalidation

我在标准中找不到关于指针/引用无效的任何定义。我问是因为我刚刚发现 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,哪些规则表明上面显示的示例实际上会使 pr 无效?

最佳答案

标准中没有“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/

相关文章:

c++ - 如何在 C++ 中实现一个真正的枚举类

c - 使用指向数组的空指针

c - 在不使用 c 中的成员名称的情况下为结构成员赋值?

c - 如何将结构指针变量作为参数传递以便在 C 中对其进行编辑

c++ - 调用 : const pointer to pointer 没有匹配函数

android - 如何将现有的仅 header 源文件添加到 android studio?

c++ - 在 OpenGL 中从 3D 切换到 2D

c++ - 实现可被接受为 std::ostringstream 引用的无操作 std::ostringstream

c++ - 将函数返回的共享指针绑定(bind)到对 const 的左值引用是好的做法吗?

c++ - 在派生类中声明为 Virtual 的函数不执行,而是给出编译错误,为什么?