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

c++, copy-constructor, templates

Solution

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;

Problem

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?

Original source