移动引用重载以访问容器中的元素?

时间:2018-08-16 03:35:50

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

STL容器对operator[]有两个重载,一个const和一个non-const以及两个对应的typedef。

template<class T>
struct vector{
      T* data_;
      using value_type = T;
      using reference = T&;
      using const_reference = T const&;
      reference operator[](int idx){return *(data_ + idx);}
      const_reference operator[](int idx) const{return *(data_ + idx);}
};

在C ++ 11中,出于一致性考虑,还需要具有r值参考返回吗?

template<class T>
struct vector{
      T* data_;
      using value_type = T;
      using reference = T&;
      using const_reference = T const&;
      using move_reference = T&&;
      reference operator[](int idx) &{return *(data_ + idx);}
      const_reference operator[](int idx) const&{return *(data_ + idx);}
      move_reference operator[](int idx) &&{return *(data_ + idx);}
};

为此,这实际上可以概括为iterator-> const_iterator-> move_iterator,对于一个简单的容器来说,它看起来像是类型爆炸和重载。

一个人可以从容器中的元素移走:

void f(vector<ExpensiveType>&& v){
     ExpensiveType et = std::move(v)[0]; // v[0] is might moved here
}

我知道在这个示例中我可以做et = std::move(v[0]),但是std::move(v)[0]更为通用,因为可以让容器以更特定的方式(通过operator[]&&处理移动)

是否在类似容器的类中讨论或实现了类似的东西?


@Praetorian建议从rvalue-ref限定的重载中返回一个值。

value_type operator[](int idx) &&{return std::move??(*(data_ + idx));}

0 个答案:

没有答案