2017-08-26 34 views
4

考虑下面的代码左值:如果您尝试运行它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; 
} 

,你

error: lvalue required as left operand of assignment

上线17

,因此

f1()

被认为是左值,而

f2()

不是。一个解释对于事情如何工作会有很大的帮助很有帮助。

+1

f1()不是左值,因为f1返回一个副本。移动信息请阅读http://en.cppreference.com/w/cpp/language/value_category 。 –

+1

我希望这很清楚为什么你不能分配给临时的'int',如果不是,我会为此添加另一个重复。 –

+0

@Baum mit Augen我没事。谢谢。 –

回答

5

f1() is considered a lvalue

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

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

1

f1()返回一个右值。你必须返回一个引用(左值),让你做这个作业

变化

int f2() { return a; } 

int& f2() { return a; } 
^

f1()返回右值,但作为类f1() = X(1);呼叫分配的实例f1().operator=(X(1));,这是没问题的。

了解更多关于value categories here.

+0

“如何让它工作”不是问题。 –

相关问题