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

chr*_*ise 3 c++ stdmap c++14

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

main.cpp:35:80: note:   no known conversion for argument 2 from ‘std::pair, std::unique_ptr >’ to ‘const std::pair, std::unique_ptr >&’
Run Code Online (Sandbox Code Playgroud)

这个演员有什么问题?

#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;
}

Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

value_typestd::mapIS std::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_ptrstd::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();
};
Run Code Online (Sandbox Code Playgroud)

您还可以使用成员类型std::maplikevalue_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();
};
Run Code Online (Sandbox Code Playgroud)