我查看了std::move_iterator<Iterator>
的STL来源,发现它返回Iterator::value_type&&
。如果Iterator::reference
是左值并且与Iterator::value_type&
不同,则会导致行为不正确。
我有一个代理对象为reference
的类(如在std::vector<bool>
中),可以隐式转换为value_type
。普通迭代器只是解引用此代理(输入迭代器要求允许这样做),但是std::move_iterator
调用转换为value_type
并带有开销,然后返回对创建的临时对象的悬空引用。
std::move_iterator
仍可与std::vector<bool>
一起使用(可能是因为bool是一个简单的类型,悬空bool&&
不会导致错误),但不会导致我的类。令我困惑的是,我不明白如何解决它,我认为这是STL中的一个错误。
以下是来自GCC 4.8.1的std::move_iterator
的简化来源:
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;
};