C++ – Understanding Copy Constructor Elision

c++constructorcopy

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,

-fno-elide-constructors

The C++ standard allows an implementation to omit creating a temporary which is only used to initialize another object of the same type. Specifying this option disables that optimization, and forces G++ to call the copy constructor in all cases.

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

Related Question