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
,它不会起作用。
我用 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
,它不会起作用。