次のコードを考えると、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 &);
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!
コード内のテンプレート コンストラクターが上記のいずれの形式とも一致しないため、それはコピーコンストラクターではありません 。
Foo
コンパイラによって生成されたコピー コンストラクターがあります。これは、提供したテンプレート変換コンストラクターで置き換えることはできません。
Foo f0;
Foo f1(f0); // calls compiler-synthesized copy constructor
Foo f2(42); // calls template conversion constructor with T=int