【发布时间】:2020-04-23 17:01:57
【问题描述】:
我发现了一个编译器错误,我无法理解为什么它只发生在带有 std::unique_ptr 的 std::map 上。
假设我们有以下未排序的地图对象和它的迭代代码:
std::unordered_map<uint32_t, std::shared_ptr<char>> map;
for (const std::pair<uint32_t, std::shared_ptr<char>>& item : map)
{
// do something
}
编译得很好,但是如果我们使用唯一指针而不是共享指针,如下所示,那么我们会得到一个关于迭代对类型的编译器错误:
std::unordered_map<uint32_t, std::unique_ptr<char>> map;
for (const std::pair<uint32_t, std::unique_ptr<char>>& item : map)
{
// do something
}
error C2440: 'initializing': cannot convert from 'std::pair<const _Kty,_Ty>' to
'const std::pair<uint32_t,std::unique_ptr<char,std::default_delete<_Ty>>>
出现此错误后,我们只需将“const”添加到键类型即可编译。
for (const std::pair<const uint32_t, std::unique_ptr<char>>& item : map)
^^^
|||
为什么这个编译错误只发生在唯一指针上?
【问题讨论】:
标签: for-loop unique-ptr unordered-map