我写了以下代码:
#include <iostream>
class A
{
public:
A(){ std::cout << "created" << std::endl; }
A(A& other) { std::cout << "copied" << std::endl; }
A& get(){ std::cout <<"got" << std::endl; return *this; }
~A(){ std::cout << "destroyed" << std::endl; }
};
现在,行
A a = A().get();
和
A a;
a = A();
编译并正常工作,但
A a = A();
的权利要求:
no matching function for call to ‘A::A(A)’
note: candidates are: A::A(A&)
note: A::A()
为了使事情明确,
A a = (A&)A();
的权利要求:
error: invalid cast of an rvalue expression of type ‘A’ to type ‘A&’
我完全不明白这种行为。
P.S。我知道,如果我在copy c_tor中进行const
引用,一切都会好的。
答案 0 :(得分:3)
复制构造函数应将其参数作为const
引用(或简单的A
值)。在您当前的设置中,程序必须对临时变量进行可变引用,这是无效的。
答案 1 :(得分:3)
这很简单:rvalue(即必须在等号的右侧),可以转换为常量引用或被复制。只有左值(即可以放在等号左边的东西)可以转换成非常量参考。原因是您可能想要修改非常量引用的内容,这将是无效的。
A()
是一个右值,因此无法转换为非常量引用。这是你的错误。
答案 2 :(得分:2)
A a = A();
此行尝试调用复制构造函数传递临时对象,复制构造函数通过非const引用获取参数。但是临时对象不能绑定到非const引用。这就是你得到编译错误的原因。
但是,临时对象可以绑定到const
引用。因此,解决方案是将参数const
引用为:
A(const A& other) { std::cout << "copied" << std::endl; }