代码:
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)
^
为什么编译器在最后一种情况下会报错?
答案 0 :(得分:7)
A a2 = func();
是copy initialization,a2
将通过复制构造函数从func()
返回的对象中初始化。 func()
按值返回,所以返回的是临时值,不能绑定到非常量的左值引用(即A &
),这就是为什么会出现错误。
临时变量可以绑定到const
的左值引用(或右值引用),因此将参数类型更改为const A &t
(或添加move构造函数)将使其工作正常。
BTW:a2 = func();
与复制构造函数无关,但与复制分配运算符无关。您没有为A
声明它,而implicitly declared copy assignment operator将const A&
作为参数,就可以了。
BTW2:func()
不返回任何内容。请注意,flowing off the end of a non-void function without returning会导致UB。