移动或交换字符串流

时间:2014-11-26 14:57:09

标签: c++11 swap move-semantics

我想移动一个字符串流,在现实世界的应用程序中我有一些stringstream类数据成员,我想在操作期间为不同的字符串重用它。

stringstream没有复制赋值或复制构造函数,这是有道理的。但是,根据cppreference.com和cplusplus.com,std :: stringstream应该定义一个移动赋值和交换操作。我试过了两个,都失败了。

移动作业

#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream

int main () {

  std::stringstream stream("1234");

  //stream = std::move(std::stringstream("5678"));

  stream.operator=(std::move(std::stringstream("5678")));

  //stream.operator=(std::stringstream("5678"));

  return 0;
}

来源:http://ideone.com/Izyanb

prog.cpp:11:56: error: use of deleted function ‘std::basic_stringstream<char>& std::basic_stringstream<char>::operator=(const std::basic_stringstream<char>&)’
   stream.operator=(std::move(std::stringstream("5678")));

编译器声明所有三个语句都没有复制赋值,这是真的。但是,我不明白为什么它没有使用move-assignment,特别是因为std :: move应该返回一个rvalue引用。 Stringstream应该有一个移动分配,如下所示:http://en.cppreference.com/w/cpp/io/basic_stringstream/operator%3D

PS:我正在使用c ++ 11,因此rvalue-references是'world'的一部分。

交换

我发现这很奇怪,我从cplusplus.com复制了示例代码但它失败了:

// swapping stringstream objects
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream

int main () {

  std::stringstream foo;
  std::stringstream bar;

  foo << 100;
  bar << 200;

  foo.swap(bar);

  int val;

  foo >> val; std::cout << "foo: " << val << '\n';
  bar >> val; std::cout << "bar: " << val << '\n';

  return 0;
}

来源:http://ideone.com/NI0xMS cplusplus.com来源:http://www.cplusplus.com/reference/sstream/stringstream/swap/

prog.cpp: In function ‘int main()’:
prog.cpp:14:7: error: ‘std::stringstream’ has no member named ‘swap’
   foo.swap(bar);

我错过了什么?为什么我不能移动或交换字符串流?我应该如何交换或移动字符串流?

2 个答案:

答案 0 :(得分:11)

这是海湾合作委员会缺少的一项功能:见bug 54316,已修复(你可以感谢Jonathan Wakely)下一个版本(gcc 5)

克隆 libc ++ 编译此代码:

int main () {

  std::stringstream stream("1234");

  std::stringstream stream2 = std::move(std::stringstream("5678"));

  return 0;
}

Live demo

also compiles the example with std::stringstream::swap

答案 1 :(得分:-2)

我有移动或交换的替代方法,也可以清除并将字符串流设置为新字符串:

    #include <string>       // std::string
    #include <iostream>     // std::cout
    #include <sstream>      // std::stringstream

    int main () {
      std::stringstream ss("1234");

      ss.clear();
      ss.str("5678");

      int val;
      ss >> val; std::cout << "val: " << val << '\n';

      return 0;
    }

这是一个干净的解决方法,除了将交换更改为clear()和str()的本地化部分外,不需要重构代码。