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));}