insert_or_assign允许迭代器

时间:2018-06-06 17:23:33

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

我有这段代码:

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

2 个答案:

答案 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迭代器调用。