为什么收到此错误“从类型'A'的右值对类型'A&'的非常量引用进行了无效的初始化”

时间:2018-06-27 14:48:38

标签: c++ c++11 reference

给出以下代码:

#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),那么,这是什么问题呢?我该如何解决?

2 个答案:

答案 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时,此对象的生存期将延长到引用的生存期。这对于函数参数很有用,但此处不建议使用。