C++ - 需要左值作为赋值的左操作数

C++ - lvalue required as left operand of assignment

考虑以下代码:

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

如果你尝试 运行 它,你会得到

error: lvalue required as left operand of assignment

在第 17 行,因此

f1()

被认为是左值,而

f2()

不是。解释将对事情如何运作有很大帮助。

f1() returns 是一个右值。您必须 return 一个引用(左值)才能执行此赋值

改变

int f2() { return a; }

int& f2() {  return a; }
   ^

f1() returns 右值但是作为 class 的实例 f1() = X(1); 调用 class f1().operator=(X(1)); 的赋值运算符是好的。

阅读更多关于 value categories here.

f1() is considered a lvalue

不,f1 returns 仍然是右值(与 f2 相同;更准确地说是 prvalue)。但是对于 class 类型,f1() = X(1); 只是被解释为 f1().operator=(X(1));,这很好,尽管它可能没有多大意义; f1() 返回的临时对象将很快被销毁。简而言之,您可以在 class 类型的右值上调用成员函数。

另一方面,直接禁止内置类型的类似行为;分配给这样的临时工根本没有意义。这就是编译器抱怨它不是左值的原因。