这是来自C ++ 11。
在构造
const
对象期间,如果访问了对象或其任何子对象的值 通过glvalue直接或间接从构造函数的this指针获取值 如此获得的对象或子对象的未指定。 [示例: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
个对象?
答案 0 :(得分:1)
要真正理解您需要与委员会成员通信的理由,或至少阅读相关讨论。我无法帮助你。
这在上下文中起作用的目的是对const对象的构造施加比一般应用更严格的限制。一般适用的规则在S12.7中有所涉及,并且广泛地关注于对象的生命周期。例如,它们并不禁止别名。
对const对象的限制将允许实施者采取更积极的优化策略。例如,可以在转换时构造对象,或者通过将其从循环中提升或仅完全优化来构造对象。由于const对象不会改变,编译器通常不必担心别名,但在这种特殊情况下(如示例代码所示),编译器会这样做。
我不禁想到必须存在这样一种情况:此规则会阻止其他一些外部可见的违反const要求的行为。给出的例子不是这种情况,我找不到一个。也许其他一些贡献者可以提供帮助。