以下代码无法编译:
#include <iostream>
#include <memory>
#include <map>
struct HaveUniq {
std::unique_ptr<int> uniq;
};
void print_hus(const std::map<int, HaveUniq>& hus) {
for (const std::pair<int, HaveUniq>& p: hus)
std::cout << *p.second.uniq << std::endl;
}
int main() {
std::map<int, HaveUniq> hus;
for (int i = 0; i < 10; ++i)
hus[i].uniq = std::unique_ptr<int>(new int(i));
print_hus(hus);
}
出现以下错误:
uniq_wtf.cpp: In function ‘void print_hus(const std::map<int, HaveUniq>&)’:
uniq_wtf.cpp:10:42: error: invalid initialization of reference of type
‘const std::pair<int, HaveUniq>&’ from expression of type
‘const std::pair<const int, HaveUniq>’
for (const std::pair<int, HaveUniq>& p: hus)
因此,它尝试遍历值而不是常量引用,并且不能将这些值强制转换为引用。
显然,具有unique_ptr作为其字段之一的对象不能具有默认的复制构造函数。但是,如果我理解正确的话,遍历地图就不会涉及复制,因此应该不会有问题。
还是地图迭代器实际上复制了值?
为什么将值强制转换为引用会出现问题?
顺便说一句,如果将unique_ptr替换为简单整数,并且将映射替换为std :: array,则代码将起作用。
最佳答案
编译器错误非常明显。 std::map::value_type
实际上是std::pair<const Key, Value>
,因此使代码工作:
for (const std::pair<const int, HaveUniq>& p: hus)
要不就
for (const auto& p : hus)
Live example
关于c++ - 无法迭代其元素持有unique_ptr的 map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35064362/