7
int a[10]; 
int b[10]; 
a = b; 

//C++のデフォルトの代入演算子

struct test { 
    int a[10]; 
}; 

test a,b; 
a = b; 

は、最初のコードは、コンパイルされませんが、2番目はありません。クラスのデフォルトの代入演算子は各データメンバーの単なる呼び出し代入ですか?なぜ2番目のコードはコンパイルされますか?

+0

デフォルトクラスの代入演算子は、配列のすべての要素をコピーします。これは 'std :: array'がユーザ提供のものなしで動作する方法です。 – chris

+1

配列がメンバーとして特別な例外が作成されたためです。 –

+0

なぜstd :: arrayに関係するのですか?何か不足していますか? – Frodo

答えて

4

C++ 11ドラフト、セクション12.8から非組合クラスXのため

暗黙的に定義されたコピー/移動代入演算子はmemberwiseコピー/移動そのサブオブジェクトの割り当てを行います。 Xの直接基底クラスが、最初に基底指定子リスト内の宣言の順序で割り当てられ、次に、Xの直接の非静的データメンバーが、それらがクラス定義で宣言された順序で割り当てられます。 xを関数のパラメータとするか、または移動演算子の場合はパラメータを参照するxvalueとします。

- サブオブジェクトがクラス型の場合は、あたかもオペレータ=の呼び出しによって、サブオブジェクトがオブジェクト式として、対応するサブオブジェクトが単一の関数として扱われているかのように指定されます(明示的な資格であるかのように、つまり、より派生したクラスで仮想オーバーライド関数を無視する)

- サブオブジェクトが配列の場合、要素の種類に応じて各要素が割り当てられます。

- サブオブジェクトがスカラー型の場合、組み込みの代入演算子が使用されます。

ここで重要なのは、次のとおりです。if the subobject is an array, each element is assigned, in the manner appropriate to the element type;

関連する問題