下段演示我的問題:(海合會編譯錯誤)關於產品使用字符串::互換()與臨時工
stringstream ss;
string s;
ss << "Hello";
// This fails:
// s.swap(ss.str());
// This works:
ss.str().swap(s);
我的錯誤:
constSwap.cc:14: error: no matching function for call to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::swap(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
basic_string.tcc:496: note: candidates are: void std::basic_string<_CharT, _Traits, _Alloc>::swap(std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
雖然我明白,STR( )在stringstream中返回一個臨時的,它沒有任何意義,並且不是直接顯而易見的,我應該用局部變量作爲參數而不是我的第一本能來調用臨時的交換。
很明顯,直接賦值效果更好,而新的C++標準具有完美的移動語義,但這些不適用於我的實現。
由於Visual Studio放寬了關於C++標準的規定,Visual Studio並沒有給出這個問題。我有點已經理解了整個const引用臨時性的東西(我認爲這是編譯錯誤的原因)。
我的問題: 任何人都可以向我解釋,如果這是唯一的解決方案,也許向我解釋如何在未來考慮這個問題,以便我可以發現和解決類似的問題?
(如果沒有人有任何偉大的見解,我至少這張貼在這裏的人有類似的問題)
另一個需要注意的是,對於交換工作,必須傳入一個非const引用。我擁有的是(因爲它是一個臨時返回)一個const rvalue。所以,我明白......其他方式都是合法的(即使我明白爲什麼這樣也是合法的),但並沒有立即做出合乎邏輯的判斷。 – Marius 2010-07-12 22:09:50
您是否正在編譯VS2010中的代碼,它有2個互換版本。一個參考和另一個右值參考。這可能是編譯的原因。 – Jagannath 2010-07-12 23:36:34
@Jagannath:我現在正在使用VS2005,所以,唉,這些新技術都不適用於我。 – Marius 2010-07-13 16:16:06