簡體   English   中英

模板化構造函數是否會覆蓋C ++中的隱式復制構造函數?

[英]Does a templated constructor override the implicit copy constructor in C++?

模板化構造函數(如下所示)是否會覆蓋隱式復制構造函數?

template <class T>
struct Foo
{
    T data;

    // ...

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

    // ...
};

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

如果是這樣,有沒有明確定義復制構造函數的方法呢?

不,那不是復制構造函數。 本標准第12.8節( [class.copy] )要求:

如果X類的第一個參數是X&const X&volatile X&const volatile X& ,並且沒有其他參數或者所有其他參數都有默認參數,則類X非模板構造函數是一個復制構造函數。

編譯器仍將隱式生成默認值。

您可以通過顯式(需要C ++ 11)

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

模板化構造函數(如下所示)是否會覆蓋隱式復制構造函數?

否。復制構造函數仍然是隱式聲明的,並且優先於模板進行選擇。

有沒有明確定義復制構造函數的方法?

不。如果您不想要隱式復制構造函數,那么您必須自己定義一個。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM