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

时间:2014-02-08 08:02:37

标签: c++ language-lawyer

这是来自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个对象?

1 个答案:

答案 0 :(得分:1)

要真正理解您需要与委员会成员通信的理​​由,或至少阅读相关讨论。我无法帮助你。

这在上下文中起作用的目的是对const对象的构造施加比一般应用更严格的限制。一般适用的规则在S12.7中有所涉及,并且广泛地关注于对象的生命周期。例如,它们并不禁止别名。

对const对象的限制将允许实施者采取更积极的优化策略。例如,可以在转换时构造对象,或者通过将其从循环中提升或仅完全优化来构造对象。由于const对象不会改变,编译器通常不必担心别名,但在这种特殊情况下(如示例代码所示),编译器会这样做。

我不禁想到必须存在这样一种情况:此规则会阻止其他一些外部可见的违反const要求的行为。给出的例子不是这种情况,我找不到一个。也许其他一些贡献者可以提供帮助。