首页 > 解决方案 > insert_or_assign 允许迭代器

问题描述

我有这段代码:

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(not const_iterator),该功能也可以正常工作。但是,在这个链接中,关于insert_or_assign签名,我只有const_iterator论据。我还在 Visual Studio 上搜索了该.h文件,并且此信息匹配。在 GCC 7.2+ 和 Visual Studio 2015 上测试,一切都可以编译和运行。

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

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

解决方案


所有容器都必须提供iterator可转换为const_iterator. 请参阅容器要求

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

所以 aconst_iterator是从调用iterator返回的 by构造的。lower_boundinsert_or_assign


推荐阅读