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 ++ - 左值需要作为赋值的左操作数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

条件运算符中的“错误:需要左值作为赋值的左操作数”

左值需要作为赋值的左操作数(递增引用的变量)C++

左值需要作为赋值的左操作数

错误:需要左值作为赋值的左操作数,我收到此错误啥是左值和右值以及如何删除此错误

需要左值作为 ios 中赋值的左操作数

使用 C++ 时需要左值作为赋值错误的左操作数