又是个计算机考古学的问题。
先看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++里没有。
总结:为啥没有?我抄他的,他也妹有啊 >_<