对于返回prvalue并返回悬空引用的迭代器,moveiterator被破坏
move_iterator is broken for iterators returning prvalues and returns dangling reference
我在STL源中查找了std::move_iterator<Iterator>
,发现它返回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;
};
C++委员会知道您遇到的问题。LWG第2106期正在跟踪此问题。该问题目前处于公开状态,这意味着该决议尚未决定。
更新
LWG第2106期在C++17中及时被接受。PR位于问题的底部(此更新中更正了链接)。
相关文章:
- 返回迭代器以提升适配器转换的容器
- lower_bound 在 C++ STL 中返回迭代器,即使元素不存在也是如此.如何避免这种情况?
- 如何从函数中返回迭代器,包括结束案例
- 按属性搜索对象的向量并返回迭代器
- C++函数,它返回迭代器到具有给定值的第一个记录
- 返回迭代器内容并将其递增的简单方法
- 在模板中返回迭代器
- 为什么 gcc-4.9.2 不能支持 std::string.insert(迭代器,范围)返回迭代器
- 从函数返回 ::迭代器不会编译
- 使用 boost::iterator_facade<> 返回迭代器的 ref,但const_ref返回 const_iterator?
- 为什么map.erase返回迭代器
- 从函数返回迭代器会给我一个奇怪的错误
- 我可以以这种方式返回迭代器吗?
- 返回迭代器引用C++
- 使用decltype返回迭代器
- 返回迭代器与松耦合
- 返回迭代器范围(主列表的子集)
- 返回迭代器的函数缺少分号错误
- 当返回迭代器时,最好返回迭代程序类型还是实际对象
- 返回迭代器似乎会使其无效