Don't quite understand why this copy constructor is not invoked when I build with debug mode using VC2010.
class SomeClass
{
public:
SomeClass(int meaningless){}
SomeClass(const SomeClass& sc)
{
cout << "Copy Constructor invoked!" << endl;
}
};
int main()
{
SomeClass test(SomeClass(9999)); // Copy constructor not invoked.
}
I think this has nothing to do with RVO since I am not returning any values.
More interesting, when I make the copy constructor private, the compiler wouldn't even compile even if it omit the copy constructor.
Best Answer
It is an optimization done by the compiler. According to the language specification, the compiler is allowed to omit the call to the copy-constructor whenever it can.
An accessible copy-constructor is needed for semantic check only, even though it is not actually called. Semantic check is done much before the optimization.
However, if you compile it with
-fno-elide-constructors
option with GCC, then the copy-elision will not be performed, and the copy-constructor will be called. The GCC doc says,With MSVC10, you can use /Od which according to the MSDN turns off all optimizations in the program.
Note : Wikipedia has an article on copy elision