我查看了STL源代码std::move_iterator
,发现它返回了Iterator::value_type&&
.当Iterator::reference
r值与r值不同时,这会导致不正确的行为Iterator::value_type&
.
我有一个代理对象的类reference
(如in std::vector
),可以隐式转换为value_type
.普通迭代器只是解释引用此代理(输入迭代器要求允许这样做),但std::move_iterator
调用转换为value_type
开销,然后返回对创建的临时对象的悬空引用.
std::move_iterator
std::vector
由于某种原因仍然可以使用(可能因为bool是一个简单的类型,悬空bool&&
不会导致错误),但不是我的班级.这让我感到困惑,我不明白如何解决它,我认为这是STL中的一个错误.
以下是std::move_iterator
GCC 4.8.1 的简化源代码:
templateclass move_iterator { public: typedef typename iterator_traits ::value_type value_type; typedef value_type&& reference; reference operator*() const { return std::move(*it); } private: Iterator it; };
Howard Hinna.. 7
您遇到的问题是C++委员会所知道的.LWG问题2106正在跟踪该问题.此问题目前处于"未结"状态,这意味着该决议尚未确定.