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_iterator
的 iterator
类型。见 Container requirements table
X::iterator
要求是任何满足正向迭代器要求的迭代器类别。 可转换为 X::const_iterator
。
因此 const_iterator
是根据 lower_bound
在对 insert_or_assign
的调用中返回的 iterator
构造的。
您的 lower_bound
调用将为您提供非常量映射上的非常量迭代器。然而,有一个从非常量迭代器到常量迭代器的自动转换,所以任何需要 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
?
所有容器都必须提供可转换为 const_iterator
的 iterator
类型。见 Container requirements table
X::iterator
要求是任何满足正向迭代器要求的迭代器类别。 可转换为 X::const_iterator
。
因此 const_iterator
是根据 lower_bound
在对 insert_or_assign
的调用中返回的 iterator
构造的。
您的 lower_bound
调用将为您提供非常量映射上的非常量迭代器。然而,有一个从非常量迭代器到常量迭代器的自动转换,所以任何需要 const_iterator 的函数都可以用相同类型的非常量迭代器调用。