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

时间:2013-12-09 13:40:38

标签: c++ c++11 stl iterator move-semantics

我查看了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;
};

1 个答案:

答案 0 :(得分:7)

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