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

时间:2010-08-03 19:04:52

标签: c++ oop function nested standards

是在开发旧的c ++标准时被认为是无用的嵌套函数的想法,因为它的用法基本上被面向对象编程等另一个概念所覆盖;或者它只是作为简化而实现的?

4 个答案:

答案 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 ++中,我们的想法是将方法与数据分组以获取类,而不是使用松散的函数。