【发布时间】:2011-03-15 00:56:16
【问题描述】:
以下片段演示了我的问题:(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 引用(我认为这是我的编译错误的原因)。
我的问题: 如果这是唯一的解决方案,谁能向我解释一下,或许可以向我解释一下将来如何考虑这个问题,以便我可以发现并解决类似的问题?
(如果没有人有任何伟大的见解,我至少在这里为有类似问题的人发布此信息)
【问题讨论】:
-
另一个注意事项,要使交换工作,必须传入一个非常量引用。我所拥有的只是(因为它是临时返回)一个 const 右值。所以我明白了......它只是没有立即的逻辑意义,相反的方式是合法的(即使我也明白为什么会这样)。
-
你是在VS2010中编译代码吗,它有2个swap变种。一个是引用,另一个是右值引用。这可能是它正在编译的原因。
-
@Jagannath:我目前正在使用 VS2005,可惜,这些新技术对我来说都没有。
-
我想我了解 C++ 规范以及为什么会发生这种情况。正如有人所说:“这不是很地道”是我卡住的地方。对我来说,我并没有立即明白我可以颠倒这两个对象并且它是被允许的......这在惯用层面上没有意义。所以这不是一个直接的技术问题,虽然我很欣赏重新发布 C++ 规范的努力,但这并不是我在原始问题中所说的那样。如果我没有说得足够清楚,我很抱歉。我只是希望以后不会被一个简单的类似问题难住。
标签: c++ string stl stream temporary