c++ - 运算符可以识别右值吗?

标签 c++ c++11 move-semantics rvalue-reference

我有一些 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 : |||

即我希望能够附加源的所有内容 w到终点v通过“std::move -ing”(从<utility> 一个接一个或从<algorithm> 按范围),这样源的所有元素都保持为空,它只需要w.clear();打电话。

是否可以让运算符识别右值引用?说:

T & ::operator += (T &, T &&);

或者还有其他我想要的东西吗?

最佳答案

是的,这行得通,但是 T 不是类型,所以您不能那样写运算符。 T 是一个模板,因此运算符需要类似于

template<typename U>
  T<U>& operator+=(T<U>&, T<U>&&);

一个可能的实现是:

template<typename U>
  T<U>& operator+=(T<U>& lhs, T<U>&& rvalue)
  {
    std::move(rvalue.begin(), rvalue.end(), std::back_inserter(lhs));
    rvalue.clear();
    return lhs;
  }

并为左值重载:

template<typename U>
  T<U>& operator+=(T<U>& lhs, const T<U>& lvalue)
  {
    std::copy(lvalue.begin(), lvalue.end(), std::back_inserter(lhs));
    return lhs;
  }

要让它适用于任何类型(我认为这是个坏主意,它应该被限制为只匹配你想要的类型)试试这个:

template< class T, class U >
  inline
  typename std::enable_if< std::is_lvalue_reference< U >::value, T& >::type
  operator += (T& lhs, U&& lvalue)
  { /* copy from lvalue */ }

template< class T, class U >
  inline
  typename std::enable_if< !std::is_lvalue_reference< U >::value, T& >::type
  operator += (T& lhs, U&& rvalue)
  { /* move from rvalue */ }

关于c++ - 运算符可以识别右值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770240/

相关文章:

c++ - Mac Mojave 上的 OpenCV C++ Xcode 错误 NSCameraUsageDescription

c++ - 字符数组的动态内存分配

用于 boost/c++11 的 C++ 包装器

c++ - move std::vector 时是否需要保留容量?

c++ - 为什么 std::tuple 的 get helper 返回右值引用而不是值

c++ - OpenProcess 句柄对 ReadProcessMemory 无效

c++ - libcurl 的标准字符串问题 - C++

c++ - 使用 lambda 的多映射谓词

c++:错误:在'class std::result_of<void (*(std::unordered_map

c++ - 右值引用绑定(bind)到 std::function 类型的左值