Невозможно привязать функцию к std :: functionпри передаче объекта std :: move () в качестве аргумента функции - PullRequest
0 голосов
/ 24 января 2019

Попытка скомпилировать следующий фрагмент кода:

#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 :: обещание, int> :: type {aka std :: _ Bind, int)) ( std :: обещание &&, int)>} 'к нескалярному типу' std :: function 'запрашивается

Я знаю, что это как-то связано с аргументом функции std :: обещание && и необходимостью std :: move, но я застрял.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Возможно, вам следует использовать move -каменную лямбду вместо 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 включить для компиляции этого кода.

0 голосов
/ 24 января 2019

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();
}
0 голосов
/ 24 января 2019

Если вы можете изменить std::promise&& на std::promise& и std::move на std::ref.

...