【问题标题】:Error: initial value of reference to non-const must be an value错误:引用非常量的初始值必须是一个值
【发布时间】:2015-10-07 20:17:44
【问题描述】:
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;
}

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

【问题讨论】:

  • 它是二元运算符(乘法) - 不是指针解引用。
  • 哦。是的。你是对的。

标签: c++ operator-overloading operators


【解决方案1】:

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

此外,这根本不是您想要的。乘法运算符绝对应该返回一个值,而不是引用。

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

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;
}

【讨论】:

  • 或者只是return lh *= rh;。不需要std::move 或另一个局部变量。
  • 您是否忘记了operator*= 中的return *this;
  • @zenith - 在这种情况下并不重要,但是当对象较大时,临时实际上起到了重要作用。它允许编译器执行参数传递和返回值优化。如果您直接返回 value 参数,则不会发生。请参阅“想要速度?按价值传递”。现在很难找到 Abrahams 的页面,但它仍然存在。
【解决方案2】:

this->v*a.v 的计算结果为 intint 无法转换为 A&

使用

A operator*(const A& a) // Return a value, not a reference.
{
   A res;
   res.v = this->v*a.v;
   return res;
}

您也应该将成员函数设为const 成员函数,因为它不会修改对象。

A operator*(const A& a) const
{
   A res;
   res.v = this->v*a.v;
   return res;
}

【讨论】:

    【解决方案3】:

    this->v * a.v 的结果是一个右值,一个临时的未命名值。作为临时,它不能绑定到 non-const 引用。只有 lvalues 可以绑定到 non-const 引用。这就是错误“引用非常量的初始值必须是l值”所指的内容。

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

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

    注意:这不会完全修复您的代码,因为您试图返回一个 int,您声明返回一个 A,并且 int 在您当前的代码中不能隐式转换为 A .

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2017-03-29
      • 2019-08-15
      相关资源
      最近更新 更多