我尝试过这样的事情:
std::copy(std::make_move_iterator(s1.begin()),std::make_move_iterator(s1.end()),std::make_move_iterator(s2.begin()));
并得到这个错误:
error: using xvalue (rvalue reference) as lvalue *__result = std::move(*__first);
这让我感到困惑.如果你使用std :: move,会发生同样的事情.似乎GCC内部使用了一个名为std :: __ copy_move_a的函数,它移动而不是复制.是否使用std :: copy或std :: move是否重要?
#include <string> #include <iostream> #include <algorithm> #include <iterator> #include <cstring> struct Test { typedef std::string::value_type value_type; std::string data; Test() { } Test(const char* data) : data(data) { } ~Test() { } Test(const Test& other) : data(other.data) { std::cout << "Copy constructor.\n"; } Test& operator=(const Test& other) { data = other.data; std::cout << "Copy assignment operator.\n"; return *this; } Test(Test&& other) : data(std::move(other.data)) { std::cout << "Move constructor.\n"; } decltype(data.begin()) begin() { return data.begin(); } decltype(data.end()) end() { return data.end(); } void push_back( std::string::value_type ch ) { data.push_back(ch); } }; int main() { Test s1("test"); Test s2("four"); std::copy(std::make_move_iterator(s1.begin()),std::make_move_iterator(s2.begin())); std::cout << s2.data; }
解决方法
std :: move(a,b,c);在语义上是相同的
std::copy(std::make_move_iterator(a),std::make_move_iterator(b),c);
你使用它们的努力都失败了,因为第三个参数 – 输出迭代器 – 不应该是移动迭代器.您正在存储到第三个迭代器中,而不是从它移动.都
std::copy(std::make_move_iterator(s1.begin()),s2.begin());
和
std::move(s1.begin(),s1.end(),s2.begin());
应该做你想做的事.