繁体   English   中英

C ++标准的12.1.14段的依据是什么?

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

这是来自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要求的行为。 给出的示例不是这种情况,我一直找不到。 也许其他贡献者可以提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM