2012-05-01 21 views
2

クラスCのメンバー変数abの初期化の順序についてgccに警告する必要がありますか?基本的にオブジェクトbは初期化され、オブジェクトAの前にコンストラクタが呼び出されます。つまり、bは初期化されていないaを使用します。 GCCからgcc:コンストラクタの初期化順序に関する警告がありません

#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; 
} 

出力:

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

ouptputとは何ですか? –

+0

あなたに警告するように伝えることができます。フラグは-Wreorderであり、-Wallでオンになっています。 –

+1

'-Wall -Werror -Wextra -pedantic-errors'でコンパイルしてください。コードはコンパイルされません。なぜなら、gccは初期化されていない – inf

答えて

5

これは初期化問題のオーダーであるためには、あなたが実際に間違った順序でサブオブジェクトを初期化しようとする必要があります。

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

が書かれているように、唯一の違反は、生涯が始まる前にオブジェクト(C::a)への参照(B::B(const A&)の引数)をバインドすることです。 aへのポインタを取ることは$ 3.8 [basic.life]/5(実際には初期化がUBになる前にまだ参照解除されています)の下で実際に合法であるため、疑わしい違反となります。

+0

あなたは正しいと思います。言及したように、技術的には、初期化の順序とは関係ありません。 –

関連する問題