且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

模板化的构造函数是否覆盖C ++中的隐式复制构造函数?

更新时间: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 type X&, const X&, volatile X& or const 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;