2016-06-19 57 views
1

我已閱讀thisthis,但我還是不明白,爲什麼下面的代碼XCode中編譯:C++:右值引用轉換成非const左值參考

void func2(string &s) { 
    s = "yyyyy"; 
} 

void func(string &&s) { 
    func2(s); 
} 

int main() { 
    func("xxxxx"); 
    return 0; 
} 

我認爲一個右值引用不應該」 t轉換爲非常量左值引用,對嗎?一般來說,左值引用和右值引用之間的轉換規則是什麼?我已經知道,常量左值引用可以綁定到右值,但右值引用(而不是右值)呢?非常感謝!

+1

在'串&& s''s'是可結合到一個左值參考左值。 – nwp

+0

我以爲''s'''是一個右值引用。爲什麼是左值?這是因爲它有身份而且是可移動的?如果是這樣,他們之間有什麼區別?謝謝! –

+0

請記住,如果一個對象有一個名稱,它是一個左值 – NathanOliver

回答

1

r值引用是對原始對象的引用,因此將其轉換爲l值引用將僅引用原始對象。
一旦移動構造函數在引用上被調用,原始對象應該被重置爲原始狀態,對其的引用也是如此。

此示例可能澄清:

#include <iostream> 
using namespace std; 

int main() 
{ 
    string s = "my string"; 
    string &&rval = move(s); 
    cout << '"' << rval << '"' << endl; // "my string" 
    cout << '"' << rval << '"' << endl; // "my string" 
    cout << '"' << s << '"' << endl; // "my string" 
    string &lval = rval; 
    cout << '"' << lval << '"' << endl; // "my string" 
    string s2(move(rval)); 
    cout << '"' << rval << '"' << endl; // "" 
    cout << '"' << lval << '"' << endl; // "" 
    cout << '"' << s << '"' << endl; // "" 
    cout << '"' << s2 << '"' << endl; // "my string" 
    return 0; 
} 
+0

我想添加'''string&lval = rval; cout <<'''<< lval <<'「'<< endl; //「我的字符串」'''這個例子對我來說會更有幫助。這是否意味着r ref可以隱式轉換爲l ref?然而,相反是錯誤的,因爲我需要明確地說移動(S)轉換一個RE參考R ref? –

+0

@雲生寶:你是對的 – Dani

+0

「一旦移動構造函數被調用引用,原始對象應該被重置爲原始狀態」這並不保證以這種方式工作。 – cpplearner