liz*_*isk 6 c++ iterator stl move-semantics c++11
我查看了STL源代码std::move_iterator<Iterator>
,发现它返回了Iterator::value_type&&
.当Iterator::reference
r值与r值不同时,这会导致不正确的行为Iterator::value_type&
.
我有一个代理对象的类reference
(如in std::vector<bool>
),可以隐式转换为value_type
.普通迭代器只是解释引用此代理(输入迭代器要求允许这样做),但std::move_iterator
调用转换为value_type
开销,然后返回对创建的临时对象的悬空引用.
std::move_iterator
std::vector<bool>
由于某种原因仍然可以使用(可能因为bool是一个简单的类型,悬空bool&&
不会导致错误),但不是我的班级.这让我感到困惑,我不明白如何解决它,我认为这是STL中的一个错误.
以下是std::move_iterator
GCC 4.8.1 的简化源代码:
template <typename Iterator>
class move_iterator {
public:
typedef typename iterator_traits<Iterator>::value_type value_type;
typedef value_type&& reference;
reference operator*() const {
return std::move(*it);
}
private:
Iterator it;
};
Run Code Online (Sandbox Code Playgroud)