为什么C++不直接允许定义局部函数,而是用lambda表达式来充当局部函数?
C++允许在局部作用域中定义类,因此可以通过局部类来模拟局部函数,例如:int main() { struct Inner { ...
- 16 个点赞 👍
又是个计算机考古学的问题。
先看Pascal为什么允许定义局部函数?因为Pascal的前身是ALGOL 60,而ALGOL 60支持局部函数:
可以看到它不仅支持局部函数,这个局部函数还是真正的闭包。
再看C++怎么来的?它来自C,而C来自B,B来自BCPL,BCPL来自CPL,CPL来自ALGOL 60。
上面说了ALGOL 60支持局部函数,那CPL呢?
也支持(甚至闭包)。那BCPL呢?
它仍然支持无状态的局部函数,但是...
编译器报了
Dynamic free variable 'outer' used
。实际上,BCPL对CPL做了简化,虽允许局部函数,但不再允许局部函数访问非静态的外部变量了。也就是说不再是一个有状态的闭包了。为啥呢?要知道BCPL的全称是Basic Combined Programming Language。它发明的动机之一就是简化CPL,因为CPL太大太复杂了。
到了B语言呢?
B语言就连局部函数也不支持了。在这之后的C、C++自然也就都失去了这一个功能。
事实上,C语言的作者(也是B语言的作者)之一,贝尔实验室的 Dennis Ritchie,在他写的 The Development of the C Language 一文中,也提到了这段历史:
BCPL, B and C differ syntactically in many details, but broadly they are similar. Programs consist of a sequence of global declarations and function (procedure) declarations. Procedures can be nested in BCPL, but may not refer to non-static objects defined in containing procedures. B and C avoid this restriction by imposing a more severe one: no nested procedures at all.
注意,GCC的C语言编译器有支持局部函数的语言扩展,但那是GCC的私货,而不是C语言标准,并且即使是GCC也只在C语言里支持,C++里没有。
总结:为啥没有?我抄他的,他也妹有啊 >_<
查看全文>>
夏洋 - 3 个点赞 👍
这就是王八的屁股:龟腚!
你可以向C++标准委员会提交一个提案,让C++允许定义局部函数,虽然绝大概率不会被接受。
你也可以fork一下GCC,让它支持定义局部函数。GCC(扩展)可以在C里面定义局部函数,所以这个改动应该很简单。
查看全文>>
exiledkingcc - 3 个点赞 👍
lambda表达式创建的“函数”是可以有状态的,这种设计源自于C++在1998年就有的operator(),因此不需要再发明一个无法支持状态的“函数”特性。
查看全文>>
萧叶轩