Eig*_*ght 10 c++ copy copy-constructor
class x
{
int a;
public:
x()
{
cout<<"\n\ndefault constructor";
}
x(x& obj)
{
cout<<"\n\ncopy constructor";
}
x fun()
{
x ob;
return ob;
}
};
int main()
{
x ob1;
x ob2=ob1.fun();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最初,这个代码给出了一个错误"没有匹配函数来调用'x :: x(x)'",当我将复制构造函数更改为
x(const x& obj)
{
cout<<"\n\ncopy constructor";
}
Run Code Online (Sandbox Code Playgroud)
输出成为
默认构造函数
默认构造函数
仍然没有执行复制构造函数....为什么?
Naw*_*waz 14
这称为由编译器完成的copy-elision,语言规范允许这样做.
看到这个wiki条目:
至于为什么非const版本给出了编译错误,因为obj1.fun()返回一个不能绑定到非const引用的临时对象,但是它可以绑定到const引用,所以const版本编译得很好.一旦你使它成为const引用,它只用于语义检查,但编译器优化代码,忽略对copy-constructor的调用.
但是,如果-fno-elide-constructors使用GCC选项编译它,则不会执行copy-elision,并且将调用copy-constructor.在GCC文档说,
-fno-的Elid,建设者
C++标准允许实现省略创建临时文件,该临时文件仅用于初始化相同类型的另一个对象.指定此选项会禁用该优化,并强制G ++在所有情况下都调用复制构造函数.
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |