为什么不是嵌套函数的想法,在旧的 c++ 标准中实现?

Poo*_*ria 5 c++ oop standards nested function

在开发较旧的 c++ 标准期间,嵌套函数的想法被认为是无用的,因为它的用法基本上被另一个概念如面向对象编程所涵盖;或者它不是为了简化而实施的?

pet*_*hen 5

嵌套函数 - 有用 - 需要包含函数的堆栈帧作为上下文。看这个:

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)进行编程时,我也会避免使用它们,因为(至少对我来说)它们使代码更加复杂且可读性较差。