2011-10-21 14 views
1

私はタイプclass Aの要素を持つベクトルを持っています。クラスAには、明示的に定義されたコピーコンストラクタがありますが、コピー演算子はプライベートで定義されていません(これは使用するためのものではありません)。ベクトルの下に新しい要素を挿入すると、vector.insert(...)はコンストラクタまたは代入演算子を呼び出しますか?

A walker;      //This calls the default constructor. 
std::vector<A> vec; 
std::vector<A>::iterator it = vec.begin(); 
vec.insert(it, walker);  //Shouldn't this call the copy constructor? 

コピーオペレータがプライベートであると不平を言うエラーが発生します。しかし、ベクトルはコピーコンストラクタを使用するべきではありませんか?

+0

どちらかを実装する場合は、**とにかく** .... –

答えて

4

vectorは実際には挿入された要素のコピーコンストラクタを使用しています。しかし、vectorは依然として内部的に代入演算子を必要としますが、vectorタイプを代入可能にするための必要条件内にあります。 C++ 11ではmove-assignmentだけが必要と考えています。

+0

の両方を実装する必要があります。 _either_ move _or_ 'classic'の割り当てが必要になります。 – sehe

+0

@sehe待って、C++ 11はどちらか一方が提供されているかどうかを判断するのに必要なイントロスペクションを提供しますか?これは不敬なSFINAEのハッカーであるのですか、それとも現在はきれいな解決策がありますか? –

+0

@Karl Knechtel:イントロスペクションは必要ありません。関数のオーバーロードがそれを行います。つまり、C++ 11はSFINAEを提供しています。このSFINAEは、C++ 03のものよりも多くのものをインスペクトすることができます。 –

関連する問題