原因尚不清楚one
不允许;嵌套函数很久以前就被提出了N0295其中说:
我们讨论在 C++ 中引入嵌套函数。嵌套
功能很好理解,并且不需要太多介绍
来自编译器供应商、程序员或委员会的努力。
嵌套函数提供了显着的优势,[...]
显然这个提议被拒绝了,但由于我们没有在线可用的会议纪要1993
我们没有可能的来源来解释这一拒绝的理由。
事实上,该提案已在C 的 Lambda 表达式和闭包
++作为一个可能的替代方案:
一篇文章 [Bre88] 和向 C 提出的提案 N0295
++ 委员会 [SH93] 建议向 C 添加嵌套函数
++。嵌套函数与 lambda 表达式类似,但被定义为函数体内的语句,并且结果
除非该函数处于活动状态,否则不能使用闭包。这些建议
也不包括为每个 lambda 表达式添加新类型,但是
相反,更像普通函数一样实现它们,包括
允许一种特殊的函数指针来引用它们。两者的
这些建议早于将模板添加到 C 中
++ ,因此不要提及嵌套函数与通用算法的结合使用。此外,这些提案无法复制
局部变量放入闭包中,因此它们的嵌套函数
产品在其封闭功能之外完全无法使用
考虑到我们现在确实有 lambda,我们不太可能看到嵌套函数,因为正如本文概述的那样,它们是同一问题的替代方案,并且嵌套函数相对于 lambda 有一些限制。
至于你问题的这一部分:
// This is legal, but why would I want this?
int two(int bar);
在某些情况下,这将是调用所需函数的有用方法。 C++ 标准部分草案3.4.1
[基本.查找.不限定]给我们举了一个有趣的例子:
namespace NS {
class T { };
void f(T);
void g(T, int);
}
NS::T parm;
void g(NS::T, float);
int main() {
f(parm); // OK: calls NS::f
extern void g(NS::T, float);
g(parm, 1); // OK: calls g(NS::T, float)
}