对于返回prvalues并返回悬空引用的迭代器,move_iterator被破坏

liz*_*isk 6 c++ iterator stl move-semantics c++11

我查看了STL源代码std::move_iterator<Iterator>,发现它返回了Iterator::value_type&&.当Iterator::referencer值与r值不同时,这会导致不正确的行为Iterator::value_type&.

我有一个代理对象的类reference(如in std::vector<bool>),可以隐式转换为value_type.普通迭代器只是解释引用此代理(输入迭代器要求允许这样做),但std::move_iterator调用转换为value_type开销,然后返回对创建的临时对象的悬空引用.

std::move_iteratorstd::vector<bool>由于某种原因仍然可以使用(可能因为bool是一个简单的类型,悬空bool&&不会导致错误),但不是我的班级.这让我感到困惑,我不明白如何解决它,我认为这是STL中的一个错误.

以下是std::move_iteratorGCC 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;
};
Run Code Online (Sandbox Code Playgroud)

How*_*ant 7

您遇到的问题是C++委员会所知道的.LWG问题2106正在跟踪该问题.此问题目前处于"未结"状态,这意味着该决议尚未确定.

  • @lizarisk:因为做这项工作的无偿志愿者不堪重负,需要完成的工作量(除了他们的日常工作).如果LWG 2106是他们必须处理的唯一问题,那么现在就可以完成.我同意你的看法,目前提出的决议似乎是正确的.它经历了几次迭代才能达到这一点. (2认同)