这可能是周五下午失明的情况……为什么地图上的累积不起作用。它给了我一个编译错误
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)
该value_type的std::mapIS std::pair<const Key, T>; 请注意,密钥被限定为const. 因此,对于std::map<std::string, std::unique_ptr<Foo>>该value_type是std::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();
};
Run Code Online (Sandbox Code Playgroud)
您还可以使用成员类型std::maplikevalue_type或const_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)