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

C++ Cannot convert lambda to std::packaged_task in std::pair

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

std::packaged_task<int(void)> task([]() -> int { return 1; });
task();

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

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

因为

error C2664: 'std::pair<int,std::packaged_task<int (void)>>::pair(const std::pair<int,std::packaged_task<int (void)>> &)': cannot convert argument 2 from 'main::<lambda_abbe6cccb9110894d95e872872ec1296>' to 'const std::packaged_task<int (void)> &'

然而,这确实编译:

std::vector<std::packaged_task<int()>> v;
v.emplace_back([](){ return 1; })

为什么我不能创建 pair

有问题的构造函数是显式构造函数。您需要显式调用它才能编译:

std::pair<int, std::packaged_task<int(void)>> 
    pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } });

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

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

vector 的情况有效,因为 emplace_back 将参数转发给 value_type 的构造函数。如果您尝试使用 push_back,它不会起作用。