代码之家  ›  专栏  ›  技术社区  ›  João Paulo

insert_或_assign允许迭代器

  •  1
  • João Paulo  · 技术社区  · 6 年前

    我有一段代码:

    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 (不是) 常量迭代器 ,函数正在工作。但是,在这 link insert_or_assign 签名,我只有 常量迭代器 论据。我还搜索了 .h visual studio上的文件与此信息匹配。在gcc 7.2+和visual studio 2015上测试,所有的东西都可以编译和运行。

    为什么要编译?为什么? 插入或分配 接受 迭代器 ?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Praetorian Luchian Grigore    6 年前

    所有容器都必须提供 iterator 可转换为 const_iterator . 见 Container requirements 桌子

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

    所以A 常量迭代器 正在从 迭代器 返回的 lower_bound 打电话给 insert_or_assign .

        2
  •  2
  •   SergeyA    6 年前

    你的 lower_bound 调用将在非常量映射上给您一个非常量迭代器。但是,存在从非常量迭代器到常量迭代器的自动转换,因此任何需要常量迭代器的函数都可以使用相同类型的非常量迭代器调用。