c++ - C++ 标准第 12.1.14 段的基本原理是什么?

标签 c++ language-lawyer

这是来自 C++11。

During the construction of a const object, if the value of the object or any of its subobjects is accessed through a glvalue that is not obtained, directly or indirectly, from the constructor’s this pointer, the value of the object or subobject thus obtained is unspecified. [ Example:

struct C;
void no_opt(C*);

struct C {
  int c;
  C() : c(0) { no_opt(this); }
};

const C cobj;

void no_opt(C* cptr) {
  int i = cobj.c * 100;          // value of cobj.c is unspecified
  cptr->c = 1;
  cout << cobj.c * 100           // value of cobj.c is unspecified
  << ’\n’;
}

end example ]

为什么它只适用于 const 对象?

最佳答案

要真正理解您需要与委员会成员通信的基本原理,或者至少阅读相关讨论。我帮不了你。

这在上下文中的作用是对 const 对象的构造施加比一般应用更严格的限制。通常适用的规则在 S12.7 中有一定篇幅的介绍,并且广泛地关注对象的生命周期。例如,它们不禁止使用别名。

对 const 对象的限制将允许实现者采用更积极的优化策略。例如,一个对象可能在翻译时构建,或者通过将其提升出循环而只构建一次,或者完全优化掉。由于 const 对象不会改变,编译器通常不必担心别名,但(如示例代码所示)在这种特殊情况下他们会担心。

我不禁想到一定有这样一种情况,即这条规则可以防止其他一些外部可见的违反 const 要求的行为。给出的示例不是这种情况,我一直找不到。也许其他贡献者可以提供帮助。

关于c++ - C++ 标准第 12.1.14 段的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21643572/

相关文章:

c++ - 从相同类型的静态成员进行类内初始化

c++ - 传递失败的模板参数

c++ - 如何在运行时指定数组的维数和?

c++ - 指向成员的指针集

c++ - 无法理解有关非专业类模板的成员的显式专业声明的规则

c++ - 这些带有 char 数组的新表达式中哪些是格式良好的?

c++ - 原始类型的类成员的初始化行为

c# - 从 C# 应用程序调用 C++ 函数。尝试读取或写入 protected 内存

c++ - 将类查看到容器中

c - 如果 strcat 函数中的目标字符串不是空终止的,它是否是未定义的行为?