C++ 无法将std::bind与std::promise一起使用
如果我使用:C++ 无法将std::bind与std::promise一起使用,c++,c++11,bind,future,C++,C++11,Bind,Future,如果我使用: int a = 3; std::function<void()> task1 = std::bind([](int a){}, std::move(a)); G++抛出一个错误: error: conversion from ‘std::_Bind_helper<false, main()::__lambda7, std::promise<int> >::type {aka std::_Bind<main()::__lambda7(std
int a = 3;
std::function<void()> task1 = std::bind([](int a){}, std::move(a));
G++抛出一个错误:
error: conversion from ‘std::_Bind_helper<false, main()::__lambda7, std::promise<int> >::type {aka std::_Bind<main()::__lambda7(std::promise<int>)>}’ to non-scalar type ‘std::function<void()>’ requested
std::function<void()> task2 = std::bind([](std::promise<int> p){}, std::move(p));
错误:请求将“std::_Bind_helper::type{aka std::_Bind}”转换为非标量类型“std::function”
std::function task2=std::bind([](std::promise p){},std::move(p));
为什么??绑定
std::promise
param有什么问题?问题是std::function
要求内部类型是可复制的。该属性适用于第一个示例(int
),但不适用于第二个示例(std::promise
仅适用于移动)。请注意,如果不使用std::function
并直接调用lambda,则代码工作正常:
std::bind([](std::promise<int>& p) { p.set_value(42); }, std::move(p))();
但是,您需要担心原始
p
变量的生存时间。另一个选择是在std::shared\u ptr
内部管理中传递承诺,你是对的。似乎std::function
需要可复制类型。我将改用std::shared\u ptr
。非常感谢!
std::bind([](std::promise<int>& p) { p.set_value(42); }, std::move(p))();
std::promise<int> p;
std::function<void()> foo = std::bind([](std::promise<int>& p) {}, std::ref(p));
foo();