C++11 移动或交换字符串流

C++11 移动或交换字符串流,c++11,swap,move-semantics,C++11,Swap,Move Semantics,我想移动一个stringstream,在现实世界的应用程序中,我有一些stringstream类数据成员,我想在操作期间为不同的字符串重用它们 stringstream没有复制赋值或复制构造函数,这很有意义。但是,根据cppreference.com和cplusplus.com,std::stringstream应该定义移动分配和交换操作。我两个都试过了,但都失败了 移动分配 我错过了什么?为什么我不能移动或交换stringstream?我应该如何交换或移动stringstream?这是GCC上

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

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

移动分配
我错过了什么?为什么我不能移动或交换stringstream?我应该如何交换或移动stringstream?

这是GCC上缺少的一项功能:请看,它已在下一个版本(GCC 5)中修复(您可以感谢Jonathan Wakely)

使用libc++编译以下代码:

int main () {

  std::stringstream stream("1234");

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

  return 0;
}


而且它

我有一个移动或交换的替代方案,也可以清除stringstream并将其设置为新字符串:

#包含//标准::字符串
#include//std::cout
#include//std::stringstream
int main(){
标准:stringstream ss(“1234”);
ss.clear();
ss.str(“5678”);
int-val;

ss>>val;std::cout目前一个常见的解决方法是将不可移动的对象(在本例中为stringstream)放在一个唯一的\u ptr中,然后移动该对象。我不参与gcc。这是Jonathan(以及Jonathan说参与的其他人)。不幸的是,
unique\u ptr
解决方案更改了API,因此即使使用符合标准的编译器的用户也必须使用它。您使用的libstdc++似乎没有实现这些。我的(随GCC 4.8.2一起提供)没有。至少4.8系列声称只与C++11语言兼容,在标准库中有一些严重的遗漏。没有必要临时使用
std::move
。@SebastianRedl我知道,我这样做是为了强制使用move赋值,而不是普通赋值,尽管这不会有什么区别。
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")));
// 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;
}
prog.cpp: In function ‘int main()’:
prog.cpp:14:7: error: ‘std::stringstream’ has no member named ‘swap’
   foo.swap(bar);
int main () {

  std::stringstream stream("1234");

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

  return 0;
}