2

gcc はメンバー変数の初期化の順序abクラス C について警告する必要がありますか? 基本的に、オブジェクト 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&)) をオブジェクト ( ) にバインドすることです。これは非常に疑わしい違反です。 5 (そして、a の初期化が UB になる前にそれを逆参照する)C::aa

于 2012-05-01T22:10:14.780 に答える