关于C ++中的复制构造函数的困惑

时间:2018-08-24 05:59:06

标签: c++ c++11 reference c++14 copy-constructor

代码:

class A 
{
public:
    A()
    {
        cout<<"Defualt Constructor"<<endl;
    }

    A(A &t) 
    { 
        cout<<"Copy Constructor"<<endl;
    }
};

A func()
{
    cout<<"In func"<<endl;
}

int main()
{
    A a1;
    A a2;
    a2 = func();
    return 0;
}

程序运行正常。另外,如果我这样调用函数:

A a2 = func();

并在复制 构造函数自变量中添加const限定词,例如:

A(const A &t) 
{ 
    cout<<"Copy Constructor"<<endl;
}

也很好。

但是,如果从复制构造函数参数中删除const,例如:

A(A &t) 
{ 
   cout<<"Copy Constructor"<<endl;
}

和调用函数func()

A a2 = func();

编译器出现错误:

error: invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A'
      A a2 = func();
                 ^
prog.cpp:13:9: note:   initializing argument 1 of 'A::A(A&)'
         A(A &t) 
         ^

为什么编译器在最后一种情况下会报错?

1 个答案:

答案 0 :(得分:7)

A a2 = func();copy initializationa2将通过复制构造函数从func()返回的对象中初始化。 func()按值返回,所以返回的是临时值,不能绑定到非常量的左值引用(即A &),这就是为什么会出现错误。

临时变量可以绑定到const的左值引用(或右值引用),因此将参数类型更改为const A &t(或添加move构造函数)将使其工作正常。

BTW:a2 = func();与复制构造函数无关,但与复制分配运算符无关。您没有为A声明它,而implicitly declared copy assignment operatorconst A&作为参数,就可以了。

BTW2:func()不返回任何内容。请注意,flowing off the end of a non-void function without returning会导致UB。