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

What is the rationale for paragraph 12.1.14 of the C++ standard?

本文关键字:是什么 14段 标准 C++      更新时间:2023-10-16

这来自C++11。

在构造const对象期间,如果访问对象或其任何子对象的值通过不是直接或间接从构造函数的this指针获得的glvalue由此获得的对象或子对象的大小是未指定的。示例:

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’;
}

--结束示例]

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

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

这在上下文中的目的是对const对象的构造施加比一般应用更严格的限制。S12.7中详细介绍了通常适用的规则,它们主要集中在对象的寿命上。例如,它们并不禁止混叠。

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

我忍不住想,一定有这样的情况,这个规则可以防止其他一些外部可见的违反const要求的行为。给出的例子不是这样的情况,我也没能找到一个。也许其他一些贡献者可以提供帮助。