insert_or_assign 允许迭代器

insert_or_assign is allowing 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

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

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

因此 const_iterator 是根据 lower_bound 在对 insert_or_assign 的调用中返回的 iterator 构造的。

您的 lower_bound 调用将为您提供非常量映射上的非常量迭代器。然而,有一个从非常量迭代器到常量迭代器的自动转换,所以任何需要 const_iterator 的函数都可以用相同类型的非常量迭代器调用。