是在开发旧的c ++标准时被认为是无用的嵌套函数的想法,因为它的用法基本上被面向对象编程等另一个概念所覆盖;或者它只是作为简化而实现的?
答案 0 :(得分:4)
嵌套函数 - 有用 - 需要包含函数的堆栈框架作为上下文。看看这个:
class Foo()
{
void Tripulate()
{
int i=0;
void Dip()
{
// ...
}
int x = 12;
for(i=1; i<=3; ++i)
{
int z= 33;
Dip();
// ...
}
}
}
Dip()应该访问哪些值?
无?你刚刚复制了(匿名)命名空间的功能,或多或少
只有i,因为它是在函数之前定义的唯一一个?
仅限于i和x,因为它们在sam范围内为Dip()
?编译器是否必须确保x
的构造函数已经运行,或者是您的工作?
z怎么样?
如果Dip获得对tripulate
的本地值和堆栈帧的任何访问权限,那么内部原型将是
void Dip(Foo * this, __auto_struct_Dip * stackContext)
{
// ...
}
您基本上复制了结构/类和成员函数的功能,但是在两个不兼容和不可交换的路径上。对于可疑的收益来说,这是很复杂的。
我希望有几次本地函数,因为这样可以更好地指出需要它的范围。但是有了所有的问题......有更多有用的东西可以让更多的复杂性投射到C ++上。
答案 1 :(得分:2)
在标准化过程中提出了这个想法(很多次)。 Steve Clamage在1996年在comp.std.c ++中写了post,回答了关于将它们添加到C ++的问题。他总结了他的观点:
最后,在我看来,嵌套函数没有解决任何问题 编程问题,C ++还没有解决方案 至少同样好。
将嵌套函数添加到C ++的提议应该显示一个重要的 嵌套函数解决的编程问题类 否则不方便解决。 (也许有这样的问题,而且 我根本没见过他们。)
安德鲁·柯尼希(Andrew Koenig)后来(1998)post间接表示委员会确实讨论过这个问题,但似乎没有任何内容可以实现。
支持嵌套函数的明显方法需要硬件支持,但仍会增加一些开销。正如Fergus Henderson在post中指出的那样,它也可以通过“trampoline”代码来支持它们,但是这种方法增加了一些编译器的复杂性(即使它们从未使用过)。
暂且不说:这三个人都是C ++标准委员会的成员(或者至少是当时的成员)。如果有记忆,那时史蒂夫要么是ISO委员会的召集人,要么是美国委员会的主席。
答案 2 :(得分:1)
你真的不需要它们 - 你可以简单地使用静态函数来完成同样的事情。即使用支持嵌套函数的语言编程,比如Pascal,我也避免使用它们,因为(至少对我来说)它们会使代码更复杂,更不易读。
答案 3 :(得分:0)
您可以使用具有所需方法的嵌套类。在C ++中,我们的想法是将方法与数据分组以获取类,而不是使用松散的函数。