C++无法将lambda转换为std :: pair中的std :: packaged_task

Zer*_*ges 5 c++ lambda stl c++11

我做了一些测试std::packaged_task并遇到了这个问题.

std::packaged_task<int(void)> task([]() -> int { return 1; });
task();
Run Code Online (Sandbox Code Playgroud)

编译并调用task()lambda.但是,这不编译:

std::pair<int, std::packaged_task<int(void)>> pair(15, []() -> int { return 15; });
pair.second();
Run Code Online (Sandbox Code Playgroud)

因为

错误C2664:' std::pair<int,std::packaged_task<int (void)>>::pair(const std::pair<int,std::packaged_task<int (void)>> &)':无法将参数2从' main::<lambda_abbe6cccb9110894d95e872872ec1296>' 转换为' const std::packaged_task<int (void)> &'

但是,这会编译:

std::vector<std::packaged_task<int()>> v;
v.emplace_back([](){ return 1; })
Run Code Online (Sandbox Code Playgroud)

为什么我不能创建一个pair?

jep*_*pio 6

有问题的构造函数是一个显式构造函数.您需要显式调用它来进行编译:

std::pair<int, std::packaged_task<int(void)>> 
    pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } });
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,使用std::make_pair:

auto pair = 
    std::make_pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } });
Run Code Online (Sandbox Code Playgroud)

vector作品的情况,因为emplace_back将参数转发给了value_type构造函数.如果你试过push_back它就行不通.