2012-06-13 11 views
7

次のようなテンプレートコンストラクタは、暗黙のコピーコンストラクタをオーバーライドしますか?もしそうならotherが一定の基準ではなく値によって渡される場合、テンプレート化されたコンストラクタは、C++の暗黙のコピーコンストラクタをオーバーライドしますか?

template <class T> 
struct Foo 
{ 
    T data; 

    // ... 

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

    // ... 
}; 

、それはまだそれを上書きしますか?

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

答えて

7

いいえ、コピーコンストラクタではありません。その最初のパラメータがタイプX&const X&volatile X&又はconst volatile X&である場合クラスXため

非テンプレートコンストラクタは、コピーコンストラクタであり、いずれかの他はありません:標準のセクション12.8([class.copy]は)ことを必要とします他のすべてのパラメータにはデフォルトの引数があります。

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

あなたは(次のような)テンプレートコンストラクタが暗黙のコピーコンストラクタをオーバーライドするん

Foo(const Foo<T>&) = default; 
2

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

いいえ。コピーコンストラクタは依然として暗黙的に宣言されており、テンプレートよりも優先されます。

明示的にコピーコンストラクタを定義しないと、この問題を回避する方法はありますか?

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

2

テンプレート[デフォルトコンストラクタ/コピーコンストラクタ/移動コンストラクタ/コピー代入演算子/移動代入演算子]のように見えるテンプレートコンストラクタや代入演算子は本当にない [デフォルトコンストラクタ/コピーコンストラクタ/移動コンストラクタ/コピー代入演算子/移動代入演算子]と置き換えたり、暗黙的に生成されないようにします。

+0

アイデアは正しいですが、あなたが書いたものは間違っています。 "コピーコンストラクタは..."という意味ですか?それは間違いです。 "テンプレート化されたコピーコンストラクタはできません..."という意味ですか?そのようなことはない。 –

+0

@BenVoigt以前よりはっきりしていたと思うが、もっと正確にしようと思った。今はもっと混乱していると思う。 – David

関連する問題