2010-11-21 22 views
9

我正在研究Linux gcc環境,我需要初始化具有默認值的類的函數參數。 當我做到這一點與類的臨時實例它使這樣的錯誤:如何初始化具有默認值的類的函數參數

void foo(std::wstring& str = std::wstring()) 

錯誤:「默認參數爲[函數參數]已例如鍵入[類別名稱] 。對於'默認參數的std :: wstring的&海峽」有型‘的std :: wstring的’ PS這個代碼是沒有任何錯誤或VC++編譯警告。

我怎麼能用來初始化的默認值?

+0

什麼是你想達到什麼目的?對我來說,它看起來毫無意義,你在做什麼.. – Simone 2010-11-21 13:49:37

+0

@Simone - 這可能是一個試驗,以獲得默認值的兩個冒險和通過引用發送。 – rkellerm 2010-11-21 13:52:36

+0

綁定到非const引用不符合標準,但VC++允許它作爲擴展AFAIK。 – 2010-11-21 17:23:59

回答

8

這是不應該編譯的。您正試圖將右值綁定到非常量引用。說std::wstring const & str,它應該工作。

9

你可以只創建一個功能過載:

void foo() { 
    std::wstring str; 
    foo(str); 
} 

但我真的很想念這一點。

編輯: 我的意思是,該函數的用途幾乎可以肯定地修改輸入字符串。如果你提供一個你以後無法訪問的空輸入字符串,爲什麼要麻煩?

+0

函數的目的也可以得到輸入字符串,而不用修改它。通過引用傳遞也可以防止複製構造函數被調用。 – rkellerm 2010-11-21 14:27:10

+0

有很多情況下它可能是有用的,比如說這不是一個字符串,而是一個緩衝區,或者某些數據(如詳細日誌)放在那裏,但您只關心結果。儘管如此,你的解決方案用標準兼容代碼輕輕地解決了這個問題:) – 2010-11-21 17:27:17

+0

@ rursw1是的,但是 - 在這種情況下 - 如果你不通過** const **引用,我認爲函數的接口是錯誤的。 – Simone 2010-11-22 07:09:47

3

您不能將非常量引用綁定到右值。按值傳遞會的工作:

void foo(std::wstring str = std::wstring()) 

或引用給const傳:

void foo(const std::wstring& str = std::wstring()) 
+0

我真的不明白你最後一句話。即使編譯器沒有優化臨時文件和複製文件,複製空字符串真的會花多少錢?如果暫時沒有了,那麼還有什麼可以移動的? – 2010-11-21 17:33:09

+0

@Charles:如果用戶*提供一個字符串作爲參數會怎麼樣?然後它必須在C++ 03中複製。 – fredoverflow 2010-11-21 17:35:53

+0

對不起,我以爲你指的是在你的評論中使用默認參數。在任何情況下,如果用戶提供的字符串在很多情況下都是臨時的,那麼它可以在C++ 03中被忽略。副本並不總是必須發生。 – 2010-11-21 17:38:21

相關問題