众所周知,Lambda表达式是利用重载operator()
实现的语法糖。
同时,Lambda表达式在不捕获变量时能够直接赋值给函数指针,很多同学可能没思考过原因。
cppint main() {
using void_func_t = void (*)();
void_func_t f {};
f = [](){};
return 0;
}
使用cpp insights看一下。(见此链接)
cppint main()
{
using void_func_t = void (*)();
using FuncPtr_3 = void_func_t;
FuncPtr_3 f = {};
class __lambda_4_7
{
public:
inline /*constexpr */ void operator()() const
{
}
using retType_4_7 = void (*)();
inline constexpr operator retType_4_7 () const noexcept
{
return __invoke;
}
private:
static inline /*constexpr */ void __invoke()
{
__lambda_4_7{}.operator()();
}
};
f = __lambda_4_7{}.operator __lambda_4_7::retType_4_7();
return 0;
}
相比于有捕获的Lambda表达式,辅助类多了两个函数,类型重载operator retType_4_7
和静态函数__invoke
,答案就显而易见了。
本文作者:OhtoAi
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!