8

次のコードを考えると、Fooにはコピーコンストラクターがありますか?FooをSTLコンテナで使用しても安全ですか?

class Foo
{
public:
   Foo() {}

   template <typename T>
   Foo(const T&) {}   
};
4

3 に答える 3

10

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

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

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

Foo標準ライブラリ コンテナーを使用しても安全ですか?

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

于 2012-09-11T16:48:24.090 に答える
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!

コード内のテンプレート コンストラクターが上記のいずれの形式とも一致しないため、それはコピーコンストラクターではありません

于 2012-09-11T16:49:51.170 に答える
1

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

Foo f0;
Foo f1(f0); // calls compiler-synthesized copy constructor
Foo f2(42); // calls template conversion constructor with T=int
于 2012-09-11T16:48:24.107 に答える