7

テンプレート化されたコンストラクター(次のような)は、暗黙のコピーコンストラクターをオーバーライドしますか?

template <class T>
struct Foo
{
    T data;

    // ...

    template <class U>
    Foo(const Foo<U> &other) : data((T)doSomethingWith(other.data)) {}

    // ...
};

もしそうなら、それotherは定数参照ではなく値によって渡された場合でもそれをオーバーライドしますか?

もしそうなら、コピーコンストラクターを明示的に定義せずにこれを回避する方法はありますか?

4

3 に答える 3

7

いいえ、それはコピー コンストラクターではありません。[class.copy]規格のセクション 12.8 ( ) では、次のことを要求しています。

class の非テンプレート コンストラクターは、最初のパラメーターの型が 、、またはであり、他のパラメーターがないか、他のすべてのパラメーターに既定の引数があるX場合、コピー コンストラクターです。X&const X&volatile X&const volatile X&

コンパイラは、デフォルトのものを暗黙的に生成します。

それを明示的にすることができます(C++ 11が必要です)

Foo(const Foo<T>&) = default;
于 2012-06-13T13:54:50.097 に答える
2

テンプレート化されたコンストラクター (次のような) は、暗黙のコピー コンストラクターをオーバーライドしますか?

いいえ。コピー コンストラクターは引き続き暗黙的に宣言され、テンプレートより優先して選択されます。

コピーコンストラクターを明示的に定義せずにこれを回避する方法はありますか?

いいえ。暗黙のコピー コンストラクターが必要ない場合は、自分で定義する必要があります。

于 2012-06-13T13:55:19.747 に答える
2

テンプレート化された [デフォルト コンストラクター/コピー コンストラクター/移動コンストラクター/コピー代入演算子/移動代入演算子] のように見えるテンプレート化されたコンストラクターまたは代入演算子は、実際には [デフォルト コンストラクター/コピー コンストラクター/移動コンストラクター/コピー代入演算子/移動代入演算子] ではありません。 ] であり、それを置き換えたり、暗黙的に生成されるのを防いだりしません。

于 2012-06-13T13:55:47.863 に答える