2016-11-24 3 views
4
struct A1 
{ 
    int n;   
}; 

struct A2 
{ 
    int n; 
    A2(){}   
}; 

struct A3 
{ 
    int n; 
    A3() = default;   
}; 

質問1:C++標準保証クラスA1A2A3は互いに完全に同等暗黙のctor、no-parameter-empty-body ctorと明示的なデフォルトctorの間で同等ですか?

をしているのか?

質問2:

A1 a1; 
A2 a2; 
A3 a3; 

コンパイラは、C++標準に従ってa1.na2.na3.nをゼロ初期化しませんか?

+2

あなたはそれが何を意味するかわかりません。最初のものは集計であり、2番目のものは集計ではありません。 –

答えて

2

A1A3aggregate typeですが、A2は1つの違いがあります。これはユーザー定義のコンストラクタがあるためです。

  • を有する

    クラスタイプ(典型的には、構造体または共用)、...

  • ないユーザ提供, inherited, or explicit (since C++17)コンストラクタ(explicitly defaulted or deleted constructors are allowed) (since C++11)
  • ...

これは、A1A3を意味しますd集計は初期化されますが、A2は初期化できません。

A1 a1{99}; // fine; n is initialized to 99 
A3 a3{99}; // fine; n is initialized to 99 
A2 a2{99}; // error; no matching constructor taking int found 

コンパイラは、C++の標準に従ってa1.na2.na3.nをゼロ初期化しませんか?

ここでは、のルールに従えば、自動保存期間でゼロ初期化が行われていない場合、すべての値が不定になります。一方、静的オブジェクトとスレッドローカルオブジェクトはzero initializedになります。

2

彼らは異なるエンティティであり、異なる初期化を有するので等しくないです:最初と最後のものは凝集体である、第二の集約ない

では、アレイまたはクラス(項9)でありますユーザ提供のコンストラクタ(12.1)、非静的データメンバ(9.2)、非公開または保護された非静的データメンバ(11章)、基本クラスなし(10 )、仮想関数はありません(10.3)。

ここでこのについて詳しく読む:What are Aggregates and PODs and how/why are they special?

だから、集計の初期化がA1A3のために働く、それはA2

struct A1 
{ 
    int n;   
}; 

struct A2 
{ 
    int n; 
    A2(){}   
}; 

struct A3 
{ 
    int n; 
    A3() = default;   
}; 


int main() 
{ 
    A1 obj1{42}; 
    //A2 obj2{42}; // error 
    A3 obj3{42}; 


    return 0; 
} 

A1 A1のためにしません。 A2 a2; A3 a3;

コンパイラはCあたりとしてa3.n a1.n、a2.nを、ゼロ初期化されません++標準

変数がdefault initializedになります。

関連する問題