以下代碼在Visual Studio 2013中編譯時沒有任何警告。刪除最後一行中的註釋將無法編譯。這是Visual Studio 2013中的一個錯誤嗎?如果不是,我該如何在標準內理解它?引用常量臨時對象的意外行爲
我認爲允許引用臨時對象是非常危險的事情,不是嗎?
struct A
{
string a;
void f(const string & toMove)
{
a = toMove;
}
void g(string & toMove)
{
a = toMove;
}
} aa;
stringstream d_SS;
d_SS << "A string";
aa.f(d_SS.str());
//aa.g(d_SS.str());
編輯
在這種related question,他們解釋說,一個「弄不準非const引用到臨時對象。我的問題是,爲什麼我們被允許以aa.f(d_SS.str())
的方式獲得對臨時對象的const引用。 d_SS.str()
在進入功能體之前就已經死了!
我不明白你在這裏遇到什麼問題。一個需要'const'引用,所以傳遞一個臨時的函數是完全可以的,因爲函數無論如何都不能改變參數。 – PaulMcKenzie 2014-11-09 07:23:51
@PaulMcKenzie:在我的理解中,不斷的和暫時的不是同一件事,它們並不意味着彼此。我對ravi的答案的評論表明d_SS.str()不是常量,因爲你可以修改它。 – Hector 2014-11-09 07:39:37
你問爲什麼'aa.f(d_SS.str());'不會給出錯誤? – 2014-11-09 07:43:02