2

gcc 是否应该警告成员变量abC 类中的初始化顺序?基本上,对象 b 已初始化,并且在对象 A 之前调用它的构造函数。这意味着b使用未初始化的a.

#include <iostream>

using namespace std;

class A
{
    private:
        int x;
    public:
        A() : x(10) { cout << __func__ << endl; }
        friend class B;
};

class B
{
    public:
        B(const A& a) { cout << "B: a.x = " << a.x << endl; }
};

class C
{
    private:
        //Note that because b is declared before a it is initialized before a
        //which means b's constructor is executed before a.
        B b;
        A a;

    public:
        C() : b(a) { cout << __func__ << endl; }
};

int main(int argc, char* argv[])
{
    C c;
}

来自 gcc 的输出:

$ g++ -Wall -c ConsInit.cpp 
$ 
4

1 回答 1

5

为了使这成为初始化问题的顺序,您实际上需要尝试以错误的顺序初始化子对象:

public:
    C() : a(), b(a) { cout << __func__ << endl; } 
          ^^^ this is attempted initialization out of order

如所写,唯一的违规行为是在对象 ( ) 的生命周期开始之前将引用( 的参数B::B(const A&))绑定到对象 ( ),这是一个非常值得怀疑的违规行为,因为在 $3.8[basic.life]/ 下C::a获取指向实际上是合法的a5(并且在a的初始化之前取消引用它是UB)

于 2012-05-01T22:10:14.780 回答