C++ 在 unique_ptr 的映射上迭代 std::accumulate():没有已知的转换

C++ iterating std::accumulate() over a map of unique_ptr: no known conversion

这可能是星期五下午失明的情况...为什么地图上的累积不起作用。它给我一个编译错误

main.cpp:35:80: note:   no known conversion for argument 2 from ‘std::pair, std::unique_ptr >’ to ‘const std::pair, std::unique_ptr >&’

这个演员有什么问题?

#include <vector>
#include <map>
#include <memory>
#include <numeric>
#include <iostream>

using namespace std;

struct Foo
{
    long bar() const {return 1;}
};


int main()
{

    std::vector<std::unique_ptr<Foo>> v;

    auto baz = [](long x, const std::unique_ptr<Foo>& p){return x + p->bar();};

    std::accumulate(v.begin(), v.end(), 0L, baz);



    std::map<std::string, std::unique_ptr<Foo>> m;

    auto bam = [](long x, const std::pair<std::string, std::unique_ptr<Foo>>& p) {
        return x + p.second->bar();
    };

    std::accumulate(m.begin(), m.end(), 0L, bam);


    return 0;
}

std::mapvalue_typestd::pair<const Key, T>;请注意,密钥限定为 const。所以对于 std::map<std::string, std::unique_ptr<Foo>>value_typestd::pair<const std::string, std::unique_ptr<Foo>>,而不是 std::pair<std::string, std::unique_ptr<Foo>>。由于 std::unique_ptr,临时 std::pair<const std::string, std::unique_ptr<Foo>> 不能从 std::pair<std::string, std::unique_ptr<Foo>> 复制构造(并绑定到参数 p,引用类型为 const)。

您可以更改 lambda 的参数类型以完全匹配 value_type,然后可以直接绑定参数。

auto bam = [](long x, const std::pair<const std::string, std::unique_ptr<Foo>>& p) {
//                                    ^^^^^
    return x + p.second->bar();
};

您也可以使用 member types of std::map,例如 value_typeconst_reference

auto bam = [](long x, const std::map<std::string, std::unique_ptr<Foo>>::value_type& p) {
    return x + p.second->bar();
};

auto bam = [](long x, std::map<std::string, std::unique_ptr<Foo>>::const_reference p) {
    return x + p.second->bar();
};