【发布时间】:2013-12-26 15:33:10
【问题描述】:
我查看了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;
};
【问题讨论】:
-
你的迭代器是什么类别?前向迭代器要求
reference为T&或T const&。 -
vector
不是容器,所以它也可能有特殊情况 -
那么
Iterator::value_type&&和std::remove_reference<Iterator::reference>::type&&必须是同一类型。请注意,链接不是标准的。 -
我说的是你的迭代器不是
vector<bool>。您的迭代器不是 InputIterator,因此上述规则适用。 -
@lizarisk:是的,输入迭代器与其他迭代器有不同的要求,它们在这里稍微灵活一些。但是你的迭代器类型是输入迭代器吗?
标签: c++ c++11 stl iterator move-semantics