2012-06-13 46 views
7

做一個模板構造函數(如以下)覆蓋隱含的拷貝構造函數?模板構造函數是否覆蓋C++中的隱式拷貝構造函數?

template <class T> 
struct Foo 
{ 
    T data; 

    // ... 

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

    // ... 
}; 

如果是這樣,它是否仍然覆蓋它,如果other是通過值而不是常量引用?

如果是這樣,是否有任何解決方法沒有明確定義複製構造函數?

回答

7

不,這不是一個拷貝構造函數。標準的12.8節([class.copy])要求:

的非模板構造爲X類是一個拷貝構造如果它的第一個參數是X&類型,const X&volatile X&const volatile X&的,並且或者沒有其他參數或其他所有參數都有默認參數。

編譯器仍會隱式生成一個默認的。

可以做出明確的

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

(需要C++ 11)難道一個模板構造函數(如以下)覆蓋隱含的拷貝構造函數?

否。複製構造函數仍隱式聲明,且優先於模板進行選擇。

有沒有任何解決方法,而不明確定義複製構造函數?

不。如果您不想隱式拷貝構造函數,那麼您必須自己定義一個。

2

用模板的構造函數或賦值運算符,它看起來像一個模板[默認構造函數/拷貝構造函數/移動構造函數/拷貝賦值運算符/移動賦值運算符]是不是真的一個[默認構造函數/拷貝構造函數/移動構造函數/複製賦值運算符/移動賦值運算符],並且不會替換它或防止隱式生成它。

+0

的想法是對的,但你寫的是錯的。你的意思是「複製構造函數不會......」?這是錯誤的。你的意思是「模板拷貝構造函數不會......」?哪有這回事。 –

+0

@BenVoigt Slthough我認爲這是明確之前,我試圖使它更準確 - 雖然TBH我認爲現在是更加混亂。 – David