Re: Template conversion and default copy constructor
Victor Bazarov wrote:
Stephan Tolksdorf wrote:
All the compilers I tested produced from the following code
executables that printed "2". Shouldn't the implicitly defined copy
constructor be called?
--
#include <iostream>
class Test{
public:
Test() : data(0) {}
template <typename T> Test(T& test) : data(2) { }
int data;
};
int main(int argc, char* argv[]) {
Test t1;
t1.data = 3;
Test t2(t1);
std::cout << t2.data;
}
No. A templated constructor never replaces the [compiler-defined]
copy constructor.
I'm not sure what you mean by "replaces" here. A templated constructor
never inhibits the generation of the compiler default. But it is still
considered in overload resolution, in cases where the copy constructor
is not required. In the above code, there is no place where the
standard specifies that the copy constructor should be used. In all of
the constructors in this code, overload resolution is used to decide
which constructor to call. And since the instantiated template function
is a better match than the default copy constructor, it gets called.
--
James Kanze kanze.james@neuf.fr
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]