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>并不重要,但当对象较大时,临时对象实际上起着重要的作用。它允许编译器执行参数传递和返回值优化。如果直接返回值参数,则无法执行此操作。看‘想要速度?按值传递'。现在很难找到亚伯拉罕的页面,但它仍然在那里。