Выбор ответа Middle Лямбды и функциональные объекты обновлено

Лямбда как указатель на функцию

Вопрос

Какую лямбду можно передать в C-функцию, принимающую int (*cmp)(const void*, const void*)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Только лямбду без захватов: она приводится к указателю на функцию. У лямбды без захватов нет состояния, и стандарт предусматривает неявное преобразование к указателю на функцию с той же сигнатурой.

Варианты ответа

  1. Любую лямбду: компилятор сам приведёт её к указателю на функцию
  2. Только лямбду с захватом по ссылке: ссылки передаются как void*
  3. Никакую, сначала нужно обернуть её в std::function и передать его
  4. Только лямбду без захватов: она приводится к указателю на функциюправильный ответ

Разбор

У лямбды без захватов нет состояния, и стандарт предусматривает неявное преобразование к указателю на функцию с той же сигнатурой. Лямбде с захватами нужен объект-замыкание, указатель на функцию его не передаст (C API обычно добавляет параметр void* user_data для этого).

  • Лямбда с захватами к указателю не приводится.
  • std::function тоже не приводится к указателю на функцию.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.