2017-08-26 81 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

「如何讓它工作」不是問題。 –

相關問題