2015-04-23 23 views
0

我不明白以下幾點:右值引用失去其本質

class Class { 
    public: 
    void operator=(string&&) { 
     cout << "here"; 
    } 
}; 

string func() { 
    return "Paul"; 
} 

int main() 
{ 
    string&& rvalueref = func(); 

    Class obj; 
    obj = rvalueref; <- error! Why isn't rvalueref a rvalue ref anymore? 

    return 0; 
} 

,因爲我可以綁定一個prvalue到右值引用,我想我還可以通過它周圍。爲什麼上述失敗?

+4

'rvalueref'是一個左值。右值引用不綁定到左值。 – chris

+0

@chris你是不是想說左值不綁定右值引用? – 0x499602D2

+0

@ 0x499602D2,我可能已經開始[此標題](http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to-atemporary - 對象)整個時間。或類似於'int'的* non-const lvalue引用的編譯器錯誤無法綁定到'int'類型的臨時值。 – chris

回答

1

我相信std::move是你想要使用。 (在<utility>中定義)
這樣就可以將左值變成右值。

//... 
int main() 
{ 
    string&& rvalueref = func(); 

    Class obj; 
    obj = std::move(rvalueref); 

    return 0; 
} 

如果您想了解更多關於它,關於移動語義和右值引用的信息可以發現here

1

在「右值引用」在說了「右值」有關什麼參考可以綁定到。一旦綁定,它只是一個參考。綁定的右值引用和綁定的左值引用沒有區別。

命名變量是左值。 (「變量」是指對象或引用)。要生成一個xvalue,即帶有右值引用類型的表達式,您將不得不使用std::move或等價物。