无法将std::bind与std::promise一起使用
Unable to use std::bind with std::promise
如果我使用:
int a = 3;
std::function<void()> task1 = std::bind([](int a){}, std::move(a));
可以,但如果我用std::promise<int>
:替换int
std::promise<int> p;
std::function<void()> task2 = std::bind([](std::promise<int> p){}, std::move(p));
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::promise
参数有什么问题?
问题是std::function
要求内部类型是可复制的。该属性适用于第一个示例(int
),但不适用于第二个示例(仅std::promise
为移动)。请注意,如果不使用std::function
并直接调用lambda,则代码运行良好:
std::bind([](std::promise<int>& p) { p.set_value(42); }, std::move(p))();
要使用std::function
,您需要将promise包装到某种包装器中。标准std::reference_wrapper
应该足够:
std::promise<int> p;
std::function<void()> foo = std::bind([](std::promise<int>& p) {}, std::ref(p));
foo();
然而,您需要担心原始p
变量的使用寿命。另一种选择是传递在std::shared_ptr
内部管理的promise。
相关文章:
- 将fold表达式与std::一起用于两个元组
- 将 std::allocate_shared 与多态资源分配器一起使用
- 将 std::set 与基于键的比较器一起使用
- 如何将AERT_Allocate与 std:vector 一起使用
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 将图形属性与 std::unique_ptr 捆绑在一起
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- 将新放置与 std::函数一起使用不起作用
- 不能将C++的"std::filesystem"库与介子构建一起使用
- 将 std::function 与模板一起使用
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 如何将 std::find() 与 2d std: 数组一起使用?
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 为什么使用与父级声明的 std::function 在与子级一起使用时会显示错误?
- 是否已经有一个 constexpr std::bit_cast 与 g++ 一起使用
- 将 std::variant 与 gmock 1.8 对象一起使用时编译错误
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用