【问题标题】:insert_or_assign is allowing iteratorinsert_or_assign 允许迭代器
【发布时间】:2018-11-16 11:29:48
【问题描述】:

我有这段代码:

auto it = my_map.lower_bound(my_key);

以下断言给了我错误:

static_assert(std::is_same<decltype(it), std::map<K, V>::const_iterator>::value, "Error");

下面的,就可以了:

static_assert(std::is_same<decltype(it), std::map<K, V>::iterator>::value, "Error");

然后,编译器没有给我const_iterator。好的。但在这里:

my_map.insert_or_assign(it, my_key, some_val);

即使使用iterator(不是const_iterator),该功能也可以正常工作。但是,在这个linkinsert_or_assign 签名上,我只有const_iterator 参数。我还在 Visual Studio 上搜索了 .h 文件,并且此信息匹配。在 GCC 7.2+ 和 Visual Studio 2015 上测试,一切都可以编译和运行。

为什么会编译?为什么insert_or_assign 接受iterator

【问题讨论】:

    标签: c++ iterator c++17 const-iterator


    【解决方案1】:

    所有容器都必须提供可转换为const_iteratoriterator 类型。查看Container requirements

    X​::​iterator 必须是任何满足前向迭代器要求的迭代器类别。 可转换为X::const_iterator

    因此,const_iterator 正在从 lower_bound 在对 insert_or_assign 的调用中返回的 iterator 构造。

    【讨论】:

      【解决方案2】:

      您的lower_bound 调用将为您提供非常量映射上的非常量迭代器。但是,非 const 迭代器会自动转换为 const-iterator,因此任何需要 const_iterator 的函数都可以使用相同类型的非 const 迭代器来调用。

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2020-03-18
        • 2017-08-30
        • 1970-01-01
        • 2016-02-12
        • 2014-01-31
        • 2012-03-13
        • 2021-02-17
        • 2018-07-24
        相关资源
        最近更新 更多