更新时间:2022-12-13 16:11:41
不,这不是一个复制构造函数。标准的第12.8节( [class.copy]
)要求:
X
类的非模板构造函数是一个复制构造函数,如果它的第一个参数是X&
,const X&
,volatile X&
或const volatile X&
并且没有其他参数或者所有其他参数都有默认参数。
编译器仍然会隐式生成一个默认的参数。 / p>
您可以通过
显示(需要C ++ 11) Foo(const Foo< T>&)= default;
Does a templated constructor (such as the following) override the implicit copy constructor?
template <class T>
struct Foo
{
T data;
// ...
template <class U>
Foo(const Foo<U> &other) : data((T)doSomethingWith(other.data)) {}
// ...
};
If so, does it still override it if other
is passed by value rather than constant reference?
If so, is there any way around this without explicitly defining a copy constructor?
No, that is not a copy constructor. Section 12.8 ([class.copy]
) of the Standard requires that:
A non-template constructor for class
X
is a copy constructor if its first parameter is of typeX&
,const X&
,volatile X&
orconst volatile X&
, and either there are no other parameters or else all other parameters have default arguments.
The compiler will still implicitly generate a defaulted one.
You can make that explicit (requires C++11) by
Foo(const Foo<T>&) = default;