错误:对非const的引用的初始值必须是一个值

时间:2015-10-07 20:17:45

标签: c++ operator-overloading operators

class A
{

public:

    int v;
    A * p;
    A& operator*(const A& a)
    {
        return this->v*a.v// here is a red line under this say error initial value of reference to non-const must be an value
    }
    ~A()
    {
        this;
    }
};

int main()
{
    A a;
    a.p = new A;
    delete a.p;
    return 0;

    system("pause");
    return 0;
}

重载*运算符我不能用它来表示对象本身。为什么会这样。

3 个答案:

答案 0 :(得分:4)

当然它说它必须是左值。您正在尝试返回对临时的引用。这是不好的业力。

此外,它根本不是你想要的。乘法运算符肯定应该返回一个值,而不是一个引用。

不确定你的构造函数是什么样的,但假设它需要一个整数:

A operator * (A const& other) const
{
    return A{ v * other.v};
};

编辑:

实际上你应该更进一步:

struct A
{
    A& operator *= (A const& other) { v *= other.v; return *this; }
    A(int i) : v(i) {}
private:
    int v;
}

A operator * (A lh, A const& rh)
{
   A res{std::move(lh)};
   res *= rh;
   return res;
}

答案 1 :(得分:3)

>>> pd.concat([pd.DataFrame(df.loc[:, ['POLY_KEY_I', 'SP1_LOWER', 'SP1_Percent']].values, columns=['POLY_KEY_I', 'SP_LOWER', 'SP_Percent']), pd.DataFrame(df.loc[:, ['POLY_KEY_I', 'SP2_LOWER', 'SP2_Percent']].values, columns=['POLY_KEY_I', 'SP_LOWER', 'SP_Percent'])], ignore_index=True).sort(['POLY_KEY_I', 'SP_LOWER']) POLY_KEY_I SP_LOWER SP_Percent 4 FS01080100SM001 BOUGRA 12.5 3 FS01080100SM001 EUPESU 20 12 FS01080100SM001 KOEPYR 12.5 0 FS01080100SM001 POAPRA 12.5 11 FS01080100SM001 POAPRA 20 10 FS01080100SM001 SYMOCC 2.5 2 FS01080100SM001 TOXRYD 2.5 8 FS01080100SM001 TOXRYD 12.5 1 FS01080100SM001 NaN 0 9 FS01080100SM001 NaN 0 13 FS01080100SM002 EUPESU 22.5 15 FS01080100SM002 KOEPYR 15 5 FS01080100SM002 POAPRA 22.5 6 FS01080100SM002 POAPRA 12.5 7 FS01080100SM002 POAPRA 15 14 FS01080100SM002 NaN 0 评估为this->v*a.vint无法转换为int

使用

A&

您应该使成员函数成为A operator*(const A& a) // Return a value, not a reference. { A res; res.v = this->v*a.v; return res; } 成员函数,因为它不会修改对象。

const

答案 2 :(得分:0)

this->v * a.v的结果是右值,一个临时的未命名值。作为临时,它不能绑定到非const 引用。只有左值才能绑定到非const 引用。这就是错误"对非const的引用的初始值必须是 l 值"指的是。

但是,您也不想返回const引用,您希望按值返回值:

A operator*(const A& a) { … }
 ^ remove &

注意:这不会完全修复您的代码,因为您尝试返回int您声明返回A的地方,而int并非如此在您当前的代码中隐式转换为A