C ++ - 左值需要作为赋值的左操作数[重复]
Posted
技术标签:
【中文标题】C ++ - 左值需要作为赋值的左操作数[重复]【英文标题】:C++ - lvalue required as left operand of assignment [duplicate] 【发布时间】:2018-02-04 08:51:54 【问题描述】:考虑以下代码:
#include <iostream>
using namespace std;
class X
int i;
public:
X(int ii = 0);
;
X::X(int ii) i = ii;
int a;
X f1() return X();
int f2() return a;
int main()
f1() = X(1);
f2() = 3;
如果你尝试运行它,你会得到
错误:需要左值作为赋值的左操作数
因此在第 17 行
f1()
被认为是左值,而
f2()
不是。对事物的运作方式有很大帮助的解释。
【问题讨论】:
f1() 不是左值,因为 f1 返回一个副本。阅读en.cppreference.com/w/cpp/language/value_category 获取移动信息。 我希望你能清楚为什么你不能分配给临时的int
,如果不是,我会为此添加另一个骗局。
@Baum mit Augen 我没事。谢谢。
【参考方案1】:
f1()
被视为左值
不,f1
返回的仍然是右值(与f2
相同;更准确地说是prvalue)。但是对于类类型,f1() = X(1);
只是解释为f1().operator=(X(1));
,这很好,尽管它可能没有多大意义; f1()
返回的临时对象将很快被销毁。简而言之,您可以在具有类类型的右值上调用成员函数。
另一方面,内置类型的类似行为是直接禁止的;分配给这样的临时工根本没有意义。这就是编译器抱怨它不是左值的原因。
【讨论】:
【参考方案2】:f1()
返回一个右值。你必须返回一个引用(左值)才能让你做这个分配
改变
int f2() return a;
到
int& f2() return a;
^
f1()
返回右值,但作为f1() = X(1);
类的实例调用f1().operator=(X(1));
类的赋值运算符,这没关系。
阅读更多关于value categories here.
【讨论】:
“如何使它工作”不是问题。以上是关于C ++ - 左值需要作为赋值的左操作数[重复]的主要内容,如果未能解决你的问题,请参考以下文章