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?