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();