一段古怪的代码
很久很久以前,我在互联网上的某个角落看到了这样一段代码。
1 |
|
该段代码可以在笔者的Clang++ 16
上通过编译并正确运行。
(我看不懂,但我大受震撼.jpg)
为了复习我学过的指针、lambda函数知识,我决定试着解释这段代码。
What’s happening?
前面的部分实在太复杂啦,也许我们可以从等号后面读起。
1 |
|
这显然是一个lambda表达式,他的返回类型是 int *(*)(int, double *)
—— 一个参数类型为int, double *
,返回int*
的函数指针。
Lambda表达式是什么?
一种用来定义匿名函数的语法。
1 |
|
函数指针是什么?
1 |
|
再看看这个表达式吧。
1 |
|
那么前面呢?
既然后面是一个lambda表达式,前面大概就是在声明函数指针吧。
1 |
|
是函数指针套娃,真难顶。
- 外层:一个函数指针,接受
(int, double *)
,返回int*
。 - 内层:一个指向函数指针
*pfunc
的指针。
结论
这段代码声明了pfunc
,它指向一个接受(void *(*)(int *, float), int)
的函数,即后面那一大个lambda表达式。
pfunc
返回一个int *(*)(int, double *)
型函数指针,即套在里面的小lambda。很显然,他的返回值是被转换成int*
类型的nullptr
。
人类怎么能写出这样的代码呢?