gpt4 book ai didi

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:37 25 4
gpt4 key购买 nike

我查看了 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&& 不会导致错误),但我的类(class)不会。这让我很困惑,我不知道如何修复它,我认为这是 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;
};

最佳答案

您遇到的问题已为 C++ 委员会所知。 LWG issue 2106 正在跟踪此问题.此问题当前处于打开状态,这意味着尚未确定解决方案。

更新

LWG issue 2106及时被 C++17 接受。 PR 位于问题的底部(链接在此更新中更正)。

关于c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20472075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com