Интересно, как компилятор обрабатывает лямбда-функции в отличие от обычных функций.Даже за исключением списка захвата, как я думаю, он называется, он ведет себя немного по-другому.
Например, как использовалось в моем последнем посте, Попытка передать лямбду constexpr и использовать ее для явногоукажите возвращаемый тип , я использовал constexpr lambda и передал его как обычный параметр функции.Я цитирую часть ответа.
Параметры функций constexpr сами по себе не являются объектами constexpr, поэтому их нельзя использовать в константных выражениях.
template <typename Lambda_T>
constexpr static auto foo(Lambda_T l) {
return std::array<event, (l())>{};
}
// Compiles with GCC (C++17), though ill-formed (according to the answer of my last post)
Хотя,что бросается в глаза, это то, что это компилирует передачу constexpr lambda
, но не компилирует передачу обычной (глобальной) функции constexpr.Что вызывает эту разницу?И есть ли другие различия в поведении компилятора между обычными функциями и лямбда-функциями?
Редактировать: Пример лямбда-реализации
foo([](){ return 4; }); // C++17 Lambda's are implicitly constexpr
Лямбда в основномоболочка для значения в этом случае.
Редактировать: Глобальная функция
Всякий раз, когда передается глобальная функция, компилятор будет жаловаться - в отличие от использования лямбда -что эту функцию, независимо от того, определена она как constexpr или нет, нельзя использовать в постоянном условии:
prog.cc:8:20: error: 'l' is not a constant expression