做一个模板构造函数重载在C ++中隐含的拷贝构造函数?(Does a templated const

2019-06-25 11:02发布

做一个模板构造函数(如以下)覆盖隐含的拷贝构造函数?

template <class T>
struct Foo
{
    T data;

    // ...

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

    // ...
};

如果是这样,它仍然覆盖它如果other是按值传递,而不是恒定的参考?

如果是这样,有没有解决这个办法没有显式定义一个拷贝构造函数?

Answer 1:

不,这不是一个拷贝构造函数。 部分12.8( [class.copy]标准的要求:

A类非模板构造函数X是一个拷贝构造函数,如果它的第一个参数是类型的X& const X& volatile X&const volatile X&而无论是有没有其他参数,否则所有其他参数默认参数。

编译器仍然会隐生成默认的一个。

你可以做出明确的(需要C ++ 11)

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


Answer 2:

做一个模板构造函数(如以下)覆盖隐含的拷贝构造函数?

号拷贝构造函数仍是隐式声明,并且选择优先于模板。

有没有解决这个办法没有显式定义一个拷贝构造函数?

否。如果你不想隐式的拷贝构造函数,那么你就必须自己定义一个。



Answer 3:

用模板的构造函数或赋值运算符,它看起来像一个模板[默认构造函数/拷贝构造函数/移动构造函数/拷贝赋值运算符/移动赋值运算符]是不是一个真正的[默认构造函数/拷贝构造函数/移动构造函数/拷贝赋值运算符/移动赋值运算符]并且将其替换或防止它被隐式生成。



文章来源: Does a templated constructor override the implicit copy constructor in C++?