Перемещение или замена stringstream

Я хочу переместить stringstream, в реальном приложении у меня есть член класса stringstream, который я хочу повторно использовать для разных строк во время работы.

stringstream не имеет конструктора copy-assignment или copy, что имеет смысл. Однако, согласно 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, тем более, что std::move должен возвращать ссылку rvalue. Stringstream должен иметь назначение перемещения, как показано здесь: http://en.cppreference.com/w/cpp/io/basic_stringstream/operator%3D

PS: Я работаю с C++11, следовательно, rvalue-ссылки являются частью "мира".

обмен

это мне показалось очень странным, я скопировал пример кода из 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);

что я упустил? Почему я не могу переместить или поменять stringstream? Как я должен поменять или переместить stringstream?

2 ответов


это отсутствующая функция на GCC: см. 54316 ошибка, Он был исправлен (вы можете поблагодарить Джонатана Уэйкли) для следующих версий (gcc 5)

лязг с libc++ компилирует этот код :

int main () {

  std::stringstream stream("1234");

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

  return 0;
}

Live demo

и также компилирует пример с std::stringstream::swap


У меня есть альтернатива перемещению или замене, можно также очистить и установить stringstream на новую строку:

    #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().