以下部分演示了我的问题:(GCC 上的编译错误)
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>]
虽然我知道 stringstream 中的 str() 返回一个临时值,但它没有意义,也不是很明显我应该使用局部变量作为参数而不是我的第一直觉来调用临时值上的交换。
显然,直接赋值效果更好,并且较新的 C++ 标准具有完美的移动语义,但这些不适用于我的实现。
Visual Studio 没有给出这个问题,因为它对 C++ 标准放宽了。我已经理解了对临时事物的整个 const 引用(我认为这是我的编译错误的原因)。
我的问题:任何人都可以向我解释这是否是唯一的解决方案,也许可以向我解释将来如何考虑这个问题,以便我可以发现并解决类似的问题?
(如果没有人有任何深刻的见解,我至少在这里为有类似问题的人发布这个)