C++ 错误:对非常量的引用的初始值必须是一个值

C++ 错误:对非常量的引用的初始值必须是一个值,c++,operator-overloading,operators,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

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

它肯定说它一定是左值。您正在尝试返回对临时文件的引用。这是恶报

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

不确定构造函数的外观,但假设它采用整数:

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;
}
编辑:

实际上,你应该更进一步:

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

当然,它说它一定是左值。您正在尝试返回对临时文件的引用。这是恶报

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

不确定构造函数的外观,但假设它采用整数:

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;
}
编辑:

实际上,你应该更进一步:

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

this->v*a.v
计算结果为
int
int
不能转换为
A&

使用

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

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

this->v*a.v
计算结果为
int
int
不能转换为
A&

使用

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

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

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

但是,您也不希望返回常量引用,而是希望按值返回值:

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

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

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

但是,您也不希望返回常量引用,而是希望按值返回值:

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

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

它是一个二进制运算符(乘法)-而不是指针解引用。哦。对你说得对。这是一个二进制运算符(乘法)-不是指针解引用。哦。对你是对的。或者只是
返回lh*=rh。没有
std::move
或需要另一个局部变量。您是否忘记了
返回*这个operator*=
?@zenith中的code>并不重要,但当对象较大时,临时对象实际上起着重要的作用。它允许编译器执行参数传递和返回值优化。如果直接返回值参数,则无法执行此操作。看‘想要速度?按值传递'。现在很难找到亚伯拉罕的页面,但它仍然在那里。没有
std::move
或需要另一个局部变量。您是否忘记了
返回*这个operator*=
?@zenith中的code>并不重要,但当对象较大时,临时对象实际上起着重要的作用。它允许编译器执行参数传递和返回值优化。如果直接返回值参数,则无法执行此操作。看‘想要速度?按值传递'。现在很难找到亚伯拉罕的页面,但它仍然在那里。