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



请考虑以下代码:

#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返回的仍然是一个右值(与f2相同;更准确地说,它是一个 prvalue(。但是对于类类型,f1() = X(1);只是被解释为f1().operator=(X(1));,这很好,即使它可能没有多大意义;f1()归还的临时物品将很快被销毁。简而言之,您可以使用类类型在右值上调用成员函数。

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

f1()返回一个右值。您必须返回引用(左值(以允许您执行此赋值

改变

int f2() { return a; }

int& f2() {  return a; }
^

f1()返回右值,但作为类f1() = X(1);的实例调用类f1().operator=(X(1));的赋值运算符,这没问题。

在此处阅读有关值类别的更多信息。

最新更新