Лямбды никоим образом не являются функциями.
Компилятор обрабатывает f1
и f2
, как если бы они были классами с операторами вызова.
Некоторые лямбды имеют неявные операторы преобразования в функцию указатели.
Вот ссылка на то, как эти двое выглядят в cppinsights.
Кстати, я сильно рекомендую использовать cppinsights если вы новичок в шаблонах C ++. Вот отличное видео о нем и вот один , где он использует cppinsights для глубокого изучения лямбд.
Я также скопировал соответствующий код здесь для объяснение, и в случае, если ссылка исчезнет.
Вот как выглядит ваш f1
.
class __lambda_1_11
{
public:
inline /*constexpr */ int operator()(int x) const
{
return x + 1;
}
using retType_1_11 = int (*)(int);
inline /*constexpr */ operator retType_1_11 () const noexcept
{
return __invoke;
};
private:
static inline int __invoke(int x)
{
return x + 1;
}
};
, и так выглядит ваш f2
.
class __lambda_2_11
{
public:
template<class type_parameter_0_0>
inline /*constexpr */ auto operator()(type_parameter_0_0 x) const
{
return x + 1;
}
private:
template<class type_parameter_0_0>
static inline auto __invoke(type_parameter_0_0 x)
{
return x + 1;
}
};
Обратите внимание, что f1
имеет не шаблонный оператор вызова и имеет оператор неявного преобразования в указатель на функцию (int (*)(int)
).
f2
имеет оператор вызова шаблона и не имеет оператора неявного преобразования - потому что оператор вызова является шаблоном функции-члена.