Xia*_*hen 1 c++ bind future c++11
如果我使用:
int a = 3;
std::function<void()> task1 = std::bind([](int a){}, std::move(a));
Run Code Online (Sandbox Code Playgroud)
这是确定的,但如果我代替int用std::promise<int>:
std::promise<int> p;
std::function<void()> task2 = std::bind([](std::promise<int> p){}, std::move(p));
Run Code Online (Sandbox Code Playgroud)
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));
Run Code Online (Sandbox Code Playgroud)
为什么?绑定一个std::promise参数有什么问题?
问题是std::function需要内部类型可复制.该属性适用于第一个示例(int)但不适用于第二个示例(std::promise仅移动).请注意,如果您不std::function直接使用并调用lambda,则代码可以正常工作:
std::bind([](std::promise<int>& p) { p.set_value(42); }, std::move(p))();
Run Code Online (Sandbox Code Playgroud)
要使用std::function,您需要将promise包装到某种包装器中.标准std::reference_wrapper应该足够了:
std::promise<int> p;
std::function<void()> foo = std::bind([](std::promise<int>& p) {}, std::ref(p));
foo();
Run Code Online (Sandbox Code Playgroud)
但是,您需要担心原始p变量的生命周期.另一种选择是传递围绕托管的承诺std::shared_ptr.
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |