请对this answer发表评论:无法初始化成员 - 是否可以?
班级成员按其申报顺序进行初始化。通过这个逻辑,下面的构造应该调用未定义行为:
struct Foo
{
Bar a;
Bar b;
Foo(Bar c) : a(b = c) { }
};
公然,我们分配给b
第一a
之前已被初始化。分配给未初始化的对象应该是UB。代码与Bar = int
“起作用”并不奇怪,但如果我用构造函数使Bar
变成一个沉重的类,我会发现b
的确在a
之前得到初始化。
(对于额外的精神错乱,我们甚至可以说Foo(Bar c, Bar d) : a(b = c), b(d) { }
,仍然没有警告。)
然而,GCC 4.6.1不警告这一点。这是可接受的,明确定义的行为,还是严格错误?
我相信UB的原因是检测这种情况的硬度。你也可以解引用NULL,你不能指望一个编译器在你用你的代码犯的任何错误上给你警告和错误。有时需要一个常识。 – littleadv
我不相信它的定义。假设'Bar'有一个不平凡的构造函数;显然,在构造“b”之前调用了'b.operator =()'。但我不确定。 – ephemient
'b'在'a'之前被初始化,还是仅仅被分配到'a'之前? –