一段古怪的代码
很久很久以前,我在互联网上的某个角落看到了这样一段代码。
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。
人类怎么能写出这样的代码呢?