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

///

struct test {
    int a[10];
};

test a,b;
a = b;

配列を割り当てることができないため、最初のコードはコンパイルされませんが、2 番目のコードはコンパイルされます。クラスのデフォルトの代入演算子は、データメンバーごとに代入を呼び出すだけではありませんか? 2 番目のコードがコンパイルされるのはなぜですか?

4

1 に答える 1

4

C++11 ドラフト、セクション 12.8 から:

非共用体クラス X に対して暗黙的に定義されたコピー/移動代入演算子は、そのサブオブジェクトのメンバーごとのコピー/移動代入を実行します。X の直接の基底クラスは、base-specifier-list での宣言の順序で最初に割り当てられ、次に X の直接の非静的データ メンバーが、クラス定義で宣言された順序で割り当てられます。 . x を関数のパラメーターとするか、move 演算子の場合はパラメーターを参照する xvalue とします。各サブオブジェクトは、そのタイプに適した方法で割り当てられます。

— サブオブジェクトがクラス型の場合、サブオブジェクトをオブジェクト式として、 x の対応するサブオブジェクトを単一の関数引数として持つ operator= の呼び出しによるかのように (明示的な修飾によるかのように; つまり、考えられる仮想オーバーライドを無視するかのように)より派生したクラスの関数);

— サブオブジェクトが配列の場合、要素の型に適した方法で各要素が割り当てられます。

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

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

于 2013-08-08T06:42:52.440 に答える