2014-02-07 118 views
-4

我想知道爲什麼我不能通過函數求作爲構造函數的參數,即:爲什麼我不能在C++中將函數評估作爲構造函數參數傳遞?

A a(fstream(argv[1])) 

,如果我嘗試打電話a.dump(),我得到一個錯誤。

如果我使用

fsrteam fin(argv[1]); 
A a(fin); 

這工作得很好。

構造函數聲明爲

A(std::fstream &file) 
+5

最煩人的解析。 – 0x499602D2

+5

我敢打賭,你保持這樣的超級祕密的錯誤對於回答你的問題是非常有益的(我同意上面的說法,它是一個MVP)。 – WhozCraig

+0

構造函數是如何聲明的? –

回答

6

您必須聲明的()如下:

A a(std::fstream &out); 

此功能的()採用對可變(非const引用)std :: fstream。但是,你的代碼:

A a(fstream(argv[1])); 

構建一個臨時的std :: fstream的,因爲這是函數調用到()表達式的一部分。 C++不允許將臨時對象用作採用非const引用的函數的參數。

這條規則的基本原理是引用的非常量意味着函數想要改變被引用的對象。隨着函數調用表達式的完成,任何對以這種方式構造的臨時對象的修改都會「丟失」,因爲臨時對象被銷燬時它們被丟棄。所以,這種情況通常是一個邏輯錯誤,並且規則的目標是「安全」並且不允許。

在你的第二種情況下,fin變量不是臨時的,所以那裏的規則不適用。

+1

+1:不是一個不好的介紹堆棧溢出,無論如何。歡迎! _(編輯:b;兩年?!)_ –

+0

很久以前的潛伏者;)決定我應該回答一些問題:) –

+0

從外表看起來我很高興你做了:) –

相關問題