0

尝试编译以下代码片段:

#include <iostream>
#include <future>
#include <functional> 

void print_num(std::promise<bool>&& result, int i )
{
    std::cout << i << " " << '\n' ;
    result.set_value(true);
}

int main()
{
   std::promise<bool> Promise0;
   std::future<bool> Result0 = Promise0.get_future();      
   std::function<void()> f_display_31337 = std::bind(print_num, std::move(Promise0), 31337);

}

收到以下错误:

在函数 'int main()': 15:90: 错误:从 'std::_Bind_helper&&, int), std::promise, int>::type {aka std::_Bind, int))(std:: promise&&, int)>}' 到非标量类型 'std::function' 请求

我知道这与函数参数 std::promise&& 以及对 std::move 的需要有关,但我被卡住了。

4

3 回答 3

1

也许您应该使用move-capturing lambda 而不是std::bind.

int main()
{
   std::promise<bool> Promise0;
   std::future<bool> Result0 = Promise0.get_future();      
   std::function<void()> f_display_31337 =
      [Promise0 = std::move(Promise0)] mutable
      { print_num(std::move(Promise0), 31337); };
}

唯一的缺点是您需要c++14启用才能编译此代码。

于 2019-01-24T03:11:38.427 回答
1

bind返回将移动promise(不可复制对象)作为数据成员的未指定类型的对象。function是 Callable 对象的包装器,实例的要求之一function是制作存储的 Callable 的副本,在您的情况下,从返回的对象无法传递给函数,因为由于作为数据成员bind而无法制作副本。promise

您应该使用auto来推断绑定结果的类型。

void print_num(std::promise<bool>& result, int i )
{
    std::cout << i << " " << '\n' ;
    result.set_value(true);
}

int main()
{
   std::promise<bool> Promise0;
   std::future<bool> Result0 = Promise0.get_future();      

   auto obj = std::bind(print_num, std::move(Promise0), 31337);
   obj();
}
于 2019-01-24T06:15:37.800 回答
0

如果您可以更改std::promise&&std::promise&和。std::movestd::ref

于 2019-01-24T02:56:18.593 回答