2013-06-25 48 views
24
struct MyClass 
{ 
    std::array<int, 10> stdArr; 

    MyClass() : stdArr() 
    {} 
}; 

MyClass c; 

質問:std :: array <int, 10>がクラスメンバとしてゼロ初期化されていますか?

  1. c.stdArrゼロ初期化されますか?
  2. はいの場合 - なぜですか?

私自身の矛盾した答え:

  1. をそれはゼロに初期化されます。 std::arrayは、c-配列のように振る舞うように望んでいます。 上記の例では、stdArrがc-arrayだった場合、初期化リストの中でstdArr()によってゼロで初期化されます。私は、初期化リストの中にmember()と書いてオブジェクトを初期化することを期待しています。

  2. それは、ゼロ初期化されません。

    • std::arrayは通常int[N]のような基本的なタイプのint[10] _Elems;
    • 通常、基本型と配列がデフォルト初期化されていない私の場合であり、単一の部材を有します。
    • std::arrayは、デフォルト構成であることを意味する集約型です。
    • _Elemsを初期化するカスタムコンストラクタがないので、ゼロ初期化されていないと思います。

C++ 11標準に従ってstd::arrayの正しい行動は何ですか?

+0

[CPP参考氏は述べています](http://en.cppreference.com/w/cpp/container/array)集計の初期化は 'のstdに動作すること:: array'、i。 e。要素**は**ゼロで初期化されます。 –

+0

@ H2CO3集約初期化が機能するということは、 '{...} '構文を使用して初期化できることを意味します。これはここでは関係ありませんが、集計の初期化はありません。 – hvd

+0

私は、それがデフォルトで初期化されたときとゼロで初期化されたときの完全な説明を持つ別の質問にリンクしました。 –

答えて

19

c.stdArrゼロ初期化されますか?

はい

YESの場合 - なぜですか?この文脈において

MyClass() : stdArr() {} 

、値の初期化の効果は、オブジェクトのzero initializationである:

これはvalue initializationstdArrを行います。

編集What are Aggregates and PODs...?で関連する情報がたくさんあります

+4

':stdArr()'は単にstd :: arrayのデフォルトのコンストラクタを呼び出すと思っていましたが、何もしません! – Martin85

+4

@ Martin85それは動作しません。何もしない(プロセス内で 'std :: array'を非集約としてレンダリングする)ユーザ定義のデフォルトコンストラクタを提供する必要があります。これはハンドルです。C++では、PODと集約をゼロ初期化することができます。 – juanchopanza

+0

[(恐ろしい)ライブの例](http://ideone.com/Y8AXoM)(決して証拠ではありません、私が知っている) –

1

"std :: arrayはc-arrayのように動作したい"とは、標準がどのように動作を記述しているかではありません。これは、ユーザー定義型だし、ユーザー定義型は、そのコンストラクタを呼び出すことによって初期化されるのメンバー、すなわちarray<int,10>::array()

+9

'std :: array'にはコンストラクタがありません。 –

+0

私はstd :: arrayをc配列のように動作させたいと言っています。しかし、私は正しいです、あなたは 'c.stdArr'が私のコードスニペットで初期化されていると思いますか?ありがとう。 – Peter

+0

@ R.MartinhoFernandes:削除されていないので、コンパイラ生成のものがあります。 – MSalters

関連する問題