以下代码无法编译:

#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/

10-10 21:25