复制构造函数省略?

Dea*_*Seo 4 c++ constructor copy

我不太明白为什么在使用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. 
}
Run Code Online (Sandbox Code Playgroud)

我认为这与RVO无关,因为我没有返回任何值.

更有趣的是,当我将复制构造函数设为私有时,即使编译器省略了复制构造函数,编译器也不会编译.

Naw*_*waz 5

这是编译器完成的优化.根据语言规范,允许编译器在可能的情况下省略对copy-constructor的调用.

只有语义检查才需要可访问的复制构造函数,即使它实际上没有调用.语义检查在优化之前完成.

但是,如果-fno-elide-constructors使用GCC选项编译它,则不会执行copy-elision,并且将调用copy-constructor.在GCC文档说,

-fno-的Elid,建设者

C++标准允许实现省略创建临时文件,该临时文件仅用于初始化相同类型的另一个对象.指定此选项会禁用该优化,并强制G ++在所有情况下都调用复制构造函数.

使用MSVC10,您可以使用/ Od根据MSDN关闭程序中的所有优化.

注意:维基百科有一篇关于复制省略的文章