Перемещение или замена 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;
}
У меня есть альтернатива перемещению или замене, можно также очистить и установить 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().