代码之家  ›  专栏  ›  技术社区  ›  Marius

关于将string::swap()用于临时变量的问题

  •  5
  • Marius  · 技术社区  · 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>]
    

    显然,直配工作更好,而新的C++标准具有移动语义,这是完美的,但这些对我的实现是不可用的。

    VisualStudio不会因为C++的标准而放松这个问题。我已经理解了对临时事物的整个const引用(我假设这是我编译错误的原因)。

    我的问题是: 有没有人能向我解释一下这是否是唯一的解决办法,也许能向我解释一下今后如何思考这个问题,这样我就可以发现类似的问题并解决它们?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Cubbi    16 年前

    std::vector<int>().swap(v); // clear and minimize capacity
    

    std::vector<int>(v).swap(v); // shrink to fit
    

    这似乎并不那么不合时宜。它是 正常的

        2
  •  7
  •   hkaiser    16 年前

    不能将临时引用绑定到非常量引用。由于这个原因,临时的 ss.str() 不能传给 std::string::swap non-const& ).

    但你为什么一开始就想交换呢?通常,一个简单的:

    std::string s(ss.str());
    

    应该足够好了。这个效率比交换(至少C++中的移动语义”低,但同时更容易阅读。

        3
  •  1
  •   Community Mohan Dere    6 年前

    swap

    §8.5.3 cv1 T1型引用由cv2 T2型表达式初始化,如下所示:

    • 否则,应参考非易失性常量类型(即cv1应为常量)。

    §3.10/10对象的左值是修改对象所必需的,但在某些情况下,类类型的右值也可用于修改其引用[示例:为对象(9.3)调用的成员函数可以修改对象。]

    你对未来的要求是,虽然你可以通过它自己的函数来修改一个临时文件,但你不能把它传递给一个可以修改它的函数或方法(通过非常量引用传递)

    推荐文章