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 类型的右值上调用成员函数。
另一方面,直接禁止内置类型的类似行为;分配给这样的临时工根本没有意义。这就是编译器抱怨它不是左值的原因。
考虑以下代码:
#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 类型的右值上调用成员函数。
另一方面,直接禁止内置类型的类似行为;分配给这样的临时工根本没有意义。这就是编译器抱怨它不是左值的原因。