Выбор ответа Middle Лямбды и функциональные объекты обновлено
Лямбда как указатель на функцию
Вопрос
Какую лямбду можно передать в C-функцию, принимающую int (*cmp)(const void*, const void*)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Только лямбду без захватов: она приводится к указателю на функцию. У лямбды без захватов нет состояния, и стандарт предусматривает неявное преобразование к указателю на функцию с той же сигнатурой.
Варианты ответа
- Любую лямбду: компилятор сам приведёт её к указателю на функцию
- Только лямбду с захватом по ссылке: ссылки передаются как
void* - Никакую, сначала нужно обернуть её в
std::functionи передать его - Только лямбду без захватов: она приводится к указателю на функциюправильный ответ
Разбор
У лямбды без захватов нет состояния, и стандарт предусматривает неявное преобразование к указателю на функцию с той же сигнатурой. Лямбде с захватами нужен объект-замыкание, указатель на функцию его не передаст (C API обычно добавляет параметр void* user_data для этого).
- Лямбда с захватами к указателю не приводится.
std::functionтоже не приводится к указателю на функцию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.