2014-10-06 32 views
1

給出:爲什麼你聲明/創建一個單獨的變量來引用調用,而不是隻是在函數調用中創建一個自動對象?

void foo(std::string &s) { 
... 
} 

爲什麼會出現這種結果的一個編譯器錯誤:

foo(std::string("fail")); 

這裏,因爲這是罰款:

std::string s("winning"); 
foo(s); 

失敗情況下的錯誤是 error: no matching function for call to ‘foo(std::string)’

in winni ng的情況下,我認爲編譯器無論如何都會優化出s。我在這裏錯過了什麼概念?

+1

從修改臨時字符串中獲得什麼? – chris 2014-10-06 17:40:07

+0

我沒有修改它。也許foo(string)正在調用somehashmap.find(string)。 – marathon 2014-10-06 17:42:53

+9

@marathon那麼它應該是const。 – user1810087 2014-10-06 17:45:27

回答

7

通過非const引用用於輸出(和inout)參數。

當你通過一個臨時的時候,沒有地方輸出去,並被調用者檢索。所以語言規則不允許這樣做。 (有一個例外 - this即使在非const成員函數中也可以臨時綁定)

如果參數是僅輸入,則通過const引用。如果參數將所有權轉移給函數,則通過右值引用傳遞。這兩種都接受臨時性。

1

如上所述,你的函數要求一個可修改的字符串,並且你給出了一個const(所有臨時值都是const)。修改您的函數簽名是:

void foo(const std::string &s) { 
... 
} 

用const引用參數,像您期望的一切都將正常工作。

相關問題