【发布时间】:2013-02-08 10:15:05
【问题描述】:
我有一些 STL 容器类型 T,比如 template< typename F > using T = std::vector< F >;。我希望能够编写以下代码:
typedef std::string F;
T< F > v(2, "a"), w(3, "b");
v += std::move(w);
std::cout << "v : ";
std::copy(std::begin(v), std::end(v), std::ostream_iterator< F >(std::cout, "|"));
std::cout << std::endl << "w : ";
std::copy(std::begin(w), std::end(w), std::ostream_iterator< F >(std::cout, "|"));
std::cout << std::endl;
并获得输出:
v : a|a|b|b|b|
w : |||
即我希望能够通过“std::move-ing”将源w 的所有内容附加到目标v 的末尾(从<utility> 一个接一个或从@987654329 @ by range),因此所有源的元素都保持为空,并且只需要调用w.clear();。
是否可以让操作符识别右值引用?说:
T & ::operator += (T &, T &&);
或者还有什么我想要的吗?
【问题讨论】:
-
error: no match for 'operator+=' in 'foo += std::move<std::vector<std::basic_string<char> >&>((* & bar))' -
int main () { std::vector< std::string > foo = {"1", "2", "3", "4"}; std::vector< std::string > bar = {"5", "6"}; foo += std::move(bar); return 0;} -
那是因为你只是尝试使用
operator+=,你并没有真正写它! -
既然没有这样的操作符,那么我们可以将问题归结为容器是用户自定义的。我不能将
operator +=声明为非成员函数,所以情况就是这样。 -
operator=必须是非静态成员函数,但operator+=不必是
标签: c++ c++11 move-semantics rvalue-reference