我正在研究Linux gcc環境,我需要初始化具有默認值的類的函數參數。 當我做到這一點與類的臨時實例它使這樣的錯誤:如何初始化具有默認值的類的函數參數
void foo(std::wstring& str = std::wstring())
錯誤:「默認參數爲[函數參數]已例如鍵入[類別名稱] 。對於'默認參數的std :: wstring的&海峽」有型‘的std :: wstring的’ PS這個代碼是沒有任何錯誤或VC++編譯警告。
我怎麼能用來初始化的默認值?
我正在研究Linux gcc環境,我需要初始化具有默認值的類的函數參數。 當我做到這一點與類的臨時實例它使這樣的錯誤:如何初始化具有默認值的類的函數參數
void foo(std::wstring& str = std::wstring())
錯誤:「默認參數爲[函數參數]已例如鍵入[類別名稱] 。對於'默認參數的std :: wstring的&海峽」有型‘的std :: wstring的’ PS這個代碼是沒有任何錯誤或VC++編譯警告。
我怎麼能用來初始化的默認值?
這是不應該編譯的。您正試圖將右值綁定到非常量引用。說std::wstring const & str
,它應該工作。
你可以只創建一個功能過載:
void foo() {
std::wstring str;
foo(str);
}
但我真的很想念這一點。
編輯: 我的意思是,該函數的用途幾乎可以肯定地修改輸入字符串。如果你提供一個你以後無法訪問的空輸入字符串,爲什麼要麻煩?
您不能將非常量引用綁定到右值。按值傳遞會的工作:
void foo(std::wstring str = std::wstring())
或引用給const傳:
void foo(const std::wstring& str = std::wstring())
我真的不明白你最後一句話。即使編譯器沒有優化臨時文件和複製文件,複製空字符串真的會花多少錢?如果暫時沒有了,那麼還有什麼可以移動的? – 2010-11-21 17:33:09
@Charles:如果用戶*提供一個字符串作爲參數會怎麼樣?然後它必須在C++ 03中複製。 – fredoverflow 2010-11-21 17:35:53
對不起,我以爲你指的是在你的評論中使用默認參數。在任何情況下,如果用戶提供的字符串在很多情況下都是臨時的,那麼它可以在C++ 03中被忽略。副本並不總是必須發生。 – 2010-11-21 17:38:21
什麼是你想達到什麼目的?對我來說,它看起來毫無意義,你在做什麼.. – Simone 2010-11-21 13:49:37
@Simone - 這可能是一個試驗,以獲得默認值的兩個冒險和通過引用發送。 – rkellerm 2010-11-21 13:52:36
綁定到非const引用不符合標準,但VC++允許它作爲擴展AFAIK。 – 2010-11-21 17:23:59