给出以下代码:
#include <iostream>
using std::ostream;
class A {
int x;
public:
A(int x) :
x(x) {
}
A& operator+=(const A& a) {
this->x = this->x + a.x;
return *this;
}
friend ostream& operator<<(ostream& os, const A& a);
};
A operator+(const A& a1, const A& a2) {
return A(a1) + a2;
}
ostream& operator<<(ostream& os, const A& a) {
return os << a.x;
}
int main() {
const A a1(2);
A& sum = a1 + a1; // error**************
std::cout << sum;
}
我收到以下错误:
类型为'A'的右值的类型为'A&'的非常量引用的无效初始化
但我不知道此错误的原因是什么。
根本上,我从operator+
获取了一个新对象,并定义了对此对象的引用(sum
),那么,这是什么问题呢?我该如何解决?
答案 0 :(得分:4)
引用无法绑定到匿名临时目录。 a1 + a1
是一个匿名临时文件。
出于兴趣,const
引用可以绑定,因此允许const A& sum = a1 + a1;
。此外,在这种特殊情况下,该临时文件的 lifetime 会扩展到引用的生存期(尽管必须注意,这不是 transitive )。
答案 1 :(得分:4)
A operator+(const A& a1, const A& a2)
这将返回类型为A
的新对象(匿名临时对象)。
A& sum = a1 + a1;
您尝试将此临时绑定到(非常量)引用;因此,尝试对寿命将要结束的对象进行引用。希望这在C ++中是不合法的。您确实需要将该对象“ 存储”:
A sum = a1 + a1;
特殊情况:
A const& sum = a1 + a1;
当将临时对象绑定到const-reference时,此对象的生存期将延长到引用的生存期。这对于函数参数很有用,但此处不建议使用。