2017-05-24 37 views
2

鑑於static const char * const x = "test";和帶有簽名void DoSomething(std::string && value)的函數,爲什麼將此左值與參數DoSomething(x);這樣的參數綁定是合法的?爲什麼靜態const char * const變量在左值時可以綁定到右值引用參數?

我的印象是字符串文字是一個字符數組,但它衰減到指針類型,仍然是一個左值。我只是困惑爲什麼這是合法的。

當帶有右值引用參數的函數期望獲取參數數據的所有權時,它如何在PE文件的只讀段中對內存起作用?我知道內存並沒有被移動,但似乎會造成問題。

回答

3

std::string不同於const char *。當您使用不能直接綁定的不同類型的表達式初始化引用時,將創建一個臨時類型爲參考的臨時類型。臨時由初始化程序提供,並且引用直接綁定到臨時。右值引用可以綁定到臨時對象。

該功能可以取得臨時數據的所有權。字符串文字不變(因爲構造函數string::string(const char *)不會更改文字,而是需要其內容的副本)。

+0

啊,這是一個很好的解釋。它並沒有跨越我的想法,它會創造一個暫時的。所以,我們並沒有真正地綁定'const char *',而是在轉換到'std :: string'的過程中創建的臨時對象。 –

+0

@ MichaelJ.Gray這是正確的。 – InternetAussie

相關問題