次のコードが与えられた場合、Fooにコピーコンストラクタがありますか? FooをSTLコンテナで使用するのは安全ですか?テンプレートコピーコンストラクタ
class Foo
{
public:
Foo() {}
template <typename T>
Foo(const T&) {}
};
次のコードが与えられた場合、Fooにコピーコンストラクタがありますか? FooをSTLコンテナで使用するのは安全ですか?テンプレートコピーコンストラクタ
class Foo
{
public:
Foo() {}
template <typename T>
Foo(const T&) {}
};
標準は、明示的にコピーコンストラクタは、同じタイプの可能性のconst-volatileオブジェクトへの参照を要する非テンプレートコンストラクタであると述べています。上記のコードでは、変換がありますが、のコピーコンストラクタ(つまり、では使用されますが、暗黙的に宣言されたコンストラクタが使用されるコピーでは使用されません)。
Foo
にコピーコンストラクタがありますか?
はい、暗黙的に宣言された/定義済みのコピーコンストラクタです。
Foo
を標準ライブラリのコンテナに使用しても安全ですか?Foo
の現在の定義では
それはあるが、一般的なケースでは、それはFoo
があり、暗黙的に定義されたコピーコンストラクタが正しくそれらを管理するかどうかをどのようなメンバーに依存します。
Foo
には、コンパイラによって生成されたコピーコンストラクタがあります。このコンストラクタは、指定したテンプレートコンバージョンコンストラクタに置き換えることはできません。
Foo f0;
Foo f1(f0); // calls compiler-synthesized copy constructor
Foo f2(42); // calls template conversion constructor with T=int
)。 ://stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –
規格によれば、コピーコンストラクタは、次のシグネチャのいずれかでなければなりません
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です。
また、デフォルトのパラメータを持つことができます – FrozenHeart
@NikitaTrophimov:はい、それもあります。 – Nawaz
テンプレート 'Foo(const Foo&)= delete;の前にこれが宣言されているとどうなりますか?クラスにコピーコンストラクタがないか、代わりにテンプレートが呼び出されますか? – orlp
コピーコンストラクタが削除された場合、そのクラスにはコピーコンストラクタはありません。 ;-) –
@ nightcrackerコピーコンストラクタは存在せず、コンパイラはエラーを返します(たとえば、移動コピーコンストラクタが使用されている可能性のある式がない限り)。キーは、コピーコンストラクタが*テンプレート化されていない*です。 – juanchopanza