嵌套函数 - 有用 - 需要包含函数的堆栈帧作为上下文。看这个:
class Foo()
{
void Tripulate()
{
int i=0;
void Dip()
{
// ...
}
int x = 12;
for(i=1; i<=3; ++i)
{
int z= 33;
Dip();
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dip() 应该访问哪些值?
没有任何?您刚刚或多或少地复制了(匿名)命名空间的功能。
只给 i,因为它是唯一一个在函数之前定义的?
仅适用于 i 和 x,因为它们与Dip()? 编译器是否必须确保 的构造函数x已经运行,或者这是您的工作?
z呢?
如果 Dip 可以访问 的局部值tripulate和堆栈帧,那么内部原型将是
void Dip(Foo * this, __auto_struct_Dip * stackContext)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
您基本上复制了结构/类和成员函数的功能,但是在两条不兼容且不可交换的路径上。对于可疑的收益来说,这是非常复杂的。
我曾多次希望使用本地函数,只是因为这会更好地表明需要它的范围。但是所有的问题......还有更多有用的东西可以将更多的复杂性放到 C++ 上。
[编辑] 使用 C++0x,lambdas 可以做到这一点,允许显式声明它们捕获的内容。
小智 1
你并不真正需要它们——你可以简单地使用静态函数来完成同样的事情。即使在使用支持嵌套函数的语言(例如 Pascal)进行编程时,我也会避免使用它们,因为(至少对我来说)它们使代码更加复杂且可读性较差。