请考虑以下代码:
#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));
的赋值运算符,这没问题。
在此处阅读有关值类别的更多信息。