2016-07-09 5 views
1

std::arrayなぜCスタイルの配列=ディープコピーをサポート

のソースコードを読むとき、それはのようなものです:なぜ、この場合の自動私は疑問に思って

template <typename T, int N> 
struct array 
{ 
    T c_arr[N]; 
}; 

生成演算子=ディープコピーをサポートしていますか?

std::array<int, 3> a1{1, 2, 3}, a2; 
a2 = a1; 

//all the elements in a1.c_arr have been copied to a2.c_arr 
copy(begin(a2), end(a2), ostream_iterator<int>(cout,"\t")); 

output: 
1 2 3 

ユーザー定義演算子=がないクラスを定義すると、ディープコピーもサポートされます。 std::array戻り始めとstd::array内部の実際の配列の終了イテレータのインスタンスに

struct Test 
{ 
    int a[3]; 
}; 

Test a1{1, 2, 3}, a2; 
a2 = a1; 

//all the elements in a1.a have been copied to a2.a 
copy(begin(a2), end(a2), ostream_iterator<int>(cout,"\t")); 


output: 
1 2 3 
+2

「ディープコピー」とは、どの意味でですか?配列は構造体に含まれています。 –

+0

配列a1のすべての要素が配列a2にコピーされます。配列をコピーするには、通常ループが必要です。 – camino

+0

'struct'を代入するだけで、オブジェクトの内容全体がコピーされます。生成されたコードにはループが存在する場合とそうでない場合があります。 –

答えて

0

std::begin()std::end()

なぜコピーコンストラクタがこれと関係しているのかわかりません。私はどこでもコピー制作が行われていないことを知っています。

+0

のため、この質問を議論の対象外としました。a1.c_arrのすべての要素がa2.c_arrにコピーされました。しかし、配列をコピーしたい場合は、ループが必要です。 – camino

+0

これは代入演算子であり、コピー・コンストラクションではありません。 –

+0

私を訂正してくれてありがとう、私はそれを更新します。 – camino

0

これは動作するためです。それは、何もしない、またはコンパイラエラーであることを除いて、意味をなさない可能性のある唯一の動作です。

Cスタイルの配列は、特に要素タイプ—の複数のインスタンスからなる集合体で、ではなく、のポインタ型です。

関連する問題