c ++中的复制构造函数中的const

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 ++在所有情况下都调用复制构造函数.