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

Geo*_*nat 4 c++ class function variable-assignment lvalue

请考虑以下代码:

#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;
} 
Run Code Online (Sandbox Code Playgroud)

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

错误:左值作为赋值的左操作数需要左值

因此,在第17行

F1()

被认为是左值,而

F2()

不是.解释将对事情的工作方式有很大的帮助.

son*_*yao 5

f1() 被认为是左值

不,f1返回的仍然是一个右值(相同的f2;更确切地说,它是一个prvalue).但对于类类型,f1() = X(1);只是被解释为f1().operator=(X(1));,即使它可能没有多大意义,它也很好; 返回的临时对象f1()很快就会被销毁.简而言之,您可以在具有类类型的右值上调用成员函数.

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