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无关,因为我没有返回任何值.
更有趣的是,当我将复制构造函数设为私有时,即使编译器省略了复制构造函数,编译器也不会编译.
这是编译器完成的优化.根据语言规范,允许编译器在可能的情况下省略对copy-constructor的调用.
只有语义检查才需要可访问的复制构造函数,即使它实际上没有被调用.语义检查在优化之前完成.
但是,如果-fno-elide-constructors使用GCC选项编译它,则不会执行copy-elision,并且将调用copy-constructor.在GCC文档说,
-fno-的Elid,建设者
C++标准允许实现省略创建临时文件,该临时文件仅用于初始化相同类型的另一个对象.指定此选项会禁用该优化,并强制G ++在所有情况下都调用复制构造函数.
使用MSVC10,您可以使用/ Od根据MSDN关闭程序中的所有优化.
注意:维基百科有一篇关于复制省略的文章