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

 妹纸叫BLACK 发布于 2023-02-12 02:40

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

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

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

以下是std::move_iteratorGCC 4.8.1 的简化源代码:

template 
class 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正在跟踪该问题.此问题目前处于"未结"状态,这意味着该决议尚未确定.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有