做一个模板构造函数(如以下)覆盖隐含的拷贝构造函数?
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]
标准的要求:
A类非模板构造函数X
是一个拷贝构造函数,如果它的第一个参数是类型的X&
const X&
volatile X&
或const volatile X&
而无论是有没有其他参数,否则所有其他参数默认参数。
编译器仍然会隐生成默认的一个。
你可以做出明确的(需要C ++ 11)
Foo(const Foo<T>&) = default;
做一个模板构造函数(如以下)覆盖隐含的拷贝构造函数?
号拷贝构造函数仍是隐式声明,并且选择优先于模板。
有没有解决这个办法没有显式定义一个拷贝构造函数?
否。如果你不想隐式的拷贝构造函数,那么你就必须自己定义一个。
用模板的构造函数或赋值运算符,它看起来像一个模板[默认构造函数/拷贝构造函数/移动构造函数/拷贝赋值运算符/移动赋值运算符]是不是一个真正的[默认构造函数/拷贝构造函数/移动构造函数/拷贝赋值运算符/移动赋值运算符]并且将其替换或防止它被隐式生成。
文章来源: Does a templated constructor override the implicit copy constructor in C++?