Как c ++ std :: bind может вернуть значение, присвоенное std :: function? - PullRequest
3 голосов
/ 07 мая 2020

Рассмотрим простой код ниже:

int f1(int a) {
  std::cout << a << std::endl;
}

int main (int agrc, char* argv[]) {
  std::function<int(int)> f = std::bind(&f1, std::placeholders::_1);
  f(123);

  return 0;
}

Я читал некоторые документы о std :: function и std :: bind, но до сих пор не понимаю, как это работает.
компилятор показывает, что вызов std :: bind возвращает объект типа _Bind_helper, однако я не вижу, что класс std :: function имеет конструктивную функцию с типом ввода _Bind_helper, так как же std :: function xxx = std: : bind xxx работа?

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Я не вижу, чтобы класс std :: function имел конструктивную функцию с типом ввода _Bind_helper, так как же работает std :: function xxx = std :: bind xxx?

Конструктор есть. Вот он:

template< class F >
function( F f );

Обратите внимание, что этот конструктор преобразования участвует в разрешении перегрузки только в том случае, если (выведенный) аргумент шаблона является Callable, то есть типом возвращаемого значения std::bind.

1 голос
/ 07 мая 2020

Согласно ccpreference.com :

Шаблон класса std::function является универсальной оболочкой функции polymorphi c. Экземпляры std::function могут хранить, копировать и вызывать любую вызываемую цель - функции, лямбда-выражения, выражения привязки или другие объекты функций, а также указатели на функции-члены и указатели на элементы данных.

Сохраненный вызываемый объект называется целью std :: function. Если std::function не содержит цели, он называется пустым. Вызов цели пустой std :: function приводит к возникновению исключения std::bad_function_call.

std :: function удовлетворяет требованиям CopyConstructible и CopyAssignable.

std::function is в основном обертка вокруг вызываемого объекта. Он известен как объект стирания типа - он стирает детали операций, чтобы обеспечить общий интерфейс.

Ваше std::bind выражение

std::bind(&f1, std::placeholders::_1)

создает объект функции, который вызывает функцию f1 с параметром, который вы указываете в качестве заполнителя, а тип возвращаемого значения - int. Следовательно, вы можете назначить это объекту функции с той же сигнатурой:

std::function<int(int)>

, который использует конструктор, принимающий вызываемый объект.

...