我有这段代码:
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
),该功能仍然有效。但是,在此link中,在insert_or_assign
签名上,我只有const_iterator
个参数。我还在Visual Studio上搜索了.h
文件,这些信息匹配。在GCC 7.2+和Visual Studio 2015上进行测试,所有内容都可以编译并运行。
为什么要编译?为什么insert_or_assign
接受iterator
?
答案 0 :(得分:2)
所有容器都必须提供可转换为iterator
的{{1}}类型。请参阅Container requirements表
const_iterator
必须是符合前向迭代器要求的任何迭代器类别。 可转换为X::iterator
。
所以X::const_iterator
是在const_iterator
的调用中由iterator
返回的lower_bound
构建的。{/ 1}。
答案 1 :(得分:2)
您的lower_bound
调用将在非const映射中为您提供非const迭代器。但是,有一个从非const迭代器到const-iterator的自动转换,所以任何需要const_iterator的函数都可以用相同类型的非const迭代器调用。