2013-05-16 10 views
7

このコードがあります:なぜ初期化変数a作品のためではなく、変数bためブレースの初期化

struct A { 
    int x; 
    void f() {} 
}; 

struct B { 
    int y; 
    virtual void f() {} 
}; 

A a = {2}; 

//B b = {3}; error: no matching constructor for initialization of 'B' 

int main() { 
    return 0; 
} 

は?

+1

ブレースの初期化は、PODタイプでのみ機能します。あなたのメソッドをバーチャルにすることは、POD以外のものになります – antlersoft

+2

[集約とポッドとは何ですか、そしてそれらがどのように特殊なのか/なぜですか?](http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how -why-are-they-special) –

答えて

10

Aは、仮想メソッドを持つため、ブレースの初期化を持つことができ、Bはありません。

8.5.1集約

凝集がないユーザ提供コンストラクタ(12.1)、非なしブレース・オア・イコール イニシャライザの配列またはクラス(項9)であります静的データメンバー(9.2)、非公開または保護された非静的データメンバー(11章)、 基本クラスなし(10節)、仮想関数なし(10.3)

+1

答えは正しいですが、答えはC++ 98、C++ 03、およびC++ 11ではまったく同じなので、'11標準に準拠する必要はありません –

+0

@DavidRodríguez-dribeasもう一度ありがとうございます。私はこれがC++の集計やPODの言葉で表現されているかどうかは分かりませんでした03。 – juanchopanza

+0

しかし、中括弧初期化子コンストラクタを書くことができませんでしたか?初期化子リストを引数として取るか? –