【发布时间】:2012-02-03 01:35:46
【问题描述】:
C++11 §12.1/14:
在构造 const 对象期间,如果对象或其任何子对象的值通过左值访问 不是从构造函数的 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) {
// value of cobj.c is unspecified
int i = cobj.c * 100;
cptr->c = 1;
// value of cobj.c is unspecified
cout << cobj.c * 100 << '\n';
}
编译上述示例输出100。我的问题是为什么在进入构造函数之前初始化列表将其设置为0 时,cobj.c 的值应该是未指定的?如果使用非常量对象,这种行为有何不同?
【问题讨论】:
-
我会注意到,在上面的示例中,
cobj.c是在cobj完全构造之前访问的。在我看来,即使对于非 const 对象,这个动作也是可疑的。 -
@MatthieuM。为什么?对我来说看起来有效(即使您将基类添加到结构 C)。
-
@VJovic:只要构造函数还没有运行,对象就不是活着的——参见 Sutter 对Constructor Failures (or, The Objects That Never Were) 的看法。如果一个对象还没有活着,访问它是可疑的。我并不是说它一定是未定义或未指定的,只是它“闻起来很糟糕”。
-
我不明白措辞。
cptr是从this获得的,但引用说“not 获得”(否则如何)?另外,这个引用意味着构造函数体不得修改任何成员,否则 const 对象的行为将未指定? -
@visitor:问题是在构造函数返回之前使用
cobj。读取权限是有问题的。
标签: c++ constructor constants