2012-09-11 3 views

答えて

10

標準は、明示的にコピーコンストラクタは、同じタイプの可能性のconst-volatileオブジェクトへの参照を要する非テンプレートコンストラクタであると述べています。上記のコードでは、変換がありますが、のコピーコンストラクタ(つまり、では使用されますが、暗黙的に宣言されたコンストラクタが使用されるコピーでは使用されません)。

Fooにコピーコンストラクタがありますか?

はい、暗黙的に宣言された/定義済みのコピーコンストラクタです。

Fooを標準ライブラリのコンテナに使用しても安全ですか? Fooの現在の定義では

それはあるが、一般的なケースでは、それはFooがあり、暗黙的に定義されたコピーコンストラクタが正しくそれらを管理するかどうかをどのようなメンバーに依存します。

+0

テンプレート 'Foo(const Foo&)= delete;の前にこれが宣言されているとどうなりますか?クラスにコピーコンストラクタがないか、代わりにテンプレートが呼び出されますか? – orlp

+1

コピーコンストラクタが削除された場合、そのクラスにはコピーコンストラクタはありません。 ;-) –

+0

@ nightcrackerコピーコンストラクタは存在せず、コンパイラはエラーを返します(たとえば、移動コピーコンストラクタが使用されている可能性のある式がない限り)。キーは、コピーコンストラクタが*テンプレート化されていない*です。 – juanchopanza

1

Fooには、コンパイラによって生成されたコピーコンストラクタがあります。このコンストラクタは、指定したテンプレートコンバージョンコンストラクタに置き換えることはできません。

Foo f0; 
Foo f1(f0); // calls compiler-synthesized copy constructor 
Foo f2(42); // calls template conversion constructor with T=int 
+0

)。 ://stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –

4

規格によれば、コピーコンストラクタは、次のシグネチャのいずれかでなければなりません

Foo(Foo &); 
Foo(Foo const &); 
Foo(Foo volatile &); 
Foo(Foo const volatile &); 

Foo(Foo&, int = 0,); 
Foo(Foo&, int = 0, float = 1.0); //i.e the rest (after first) of the 
           //parameter(s) must have default values! 

コードテンプレートコンストラクタは、上記のいずれかの形態と一致していないのでつまり、ではなく、コピー -constructorです。

+1

また、デフォルトのパラメータを持つことができます – FrozenHeart

+0

@NikitaTrophimov:はい、それもあります。 – Nawaz