Her*_*ert 7 swap move-semantics c++11
我想移动一个字符串流,在现实世界的应用程序中我有一些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;
}
Run Code Online (Sandbox Code Playgroud)
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")));
Run Code Online (Sandbox Code Playgroud)
编译器声明所有三个语句都没有复制赋值,这是真的.但是,我不明白为什么它没有使用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;
}
Run Code Online (Sandbox Code Playgroud)
来源: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);
Run Code Online (Sandbox Code Playgroud)
我错过了什么?为什么我不能移动或交换字符串流?我该如何交换或移动字符串流?
qua*_*dev 11
这是GCC缺少的功能:请参阅错误54316,已修复(您可以感谢Jonathan Wakely)以获取下一个版本(gcc 5)
使用libc ++克隆编译此代码:
int main () {
std::stringstream stream("1234");
std::stringstream stream2 = std::move(std::stringstream("5678"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而且它还会编译与示例std::stringstream::swap