Re: Copy constructor doesn't get called when initialized by function returning object of same class
abhash wrote:
I am bit puzzled at the following piece of code I tried:
------------------------------------------------------------
#include <iostream>
using namespace std;
class Test {
public:
Test() { cout<<"Cons\n";}
Test(Test& a) { cout<<"Copy cons\n";}
You probably mean Test(Test const&).
};
Test fun()
{
return Test();
}
int main()
{
cout<<"First way of initialization\n";
Test t1;
Test t2 = t1;
cout<<"\nSecond way of initialization\n";
Test t3 = fun();
return 0;
}
OUTPUT (when compiled on CC compiler) :
First way of initialization
Cons
Copy cons
Second way of initialization
Cons
First of all if you really had your ctor taking a reference to non const as
you showed above then you are using a broken compiler. Your compiler should
have complained of not finding a Test(Test const&) ctor version.
I am intrigued why second initialization does call copy constructor ?
Aren't we passing the temporary object returned by fun() call to the
t3 for copying ?
Because you are one of the lucky ones using a compiler that does RVO. But
still your compiler is broken because while the standard allows compilers
to elude calling the copy ctor in certain situations (such as yours) for
speed benefits, it does require that the object has a proper copy ctor AS
IF it would have been called (even if it's not).
Enable strict standard compliance mode in your compiler (that should get the
compile error Im talking about), then disable any optimization (or enable
debug mode, depends on compiler), then retry the program. You should see
then the copy ctor getting called.
--
Dizzy