C++;11是否支持本地功能? 现在C++中有lambda,我不能声明一个本地函数……

C++;11是否支持本地功能? 现在C++中有lambda,我不能声明一个本地函数……,c++,c++11,C++,C++11,e、 g: 我可以在函数体中声明类型,甚至可以将其初始化为值表。但是我不能创建一个使用该数据类型的助手函数,因为我不能在函数中声明函数,也不能在函数之外引用该数据类型,因为它只在该范围内可用 有时,从函数中提取数据类型并在其中定义我的数据类型和助手函数(本地文件范围)非常简单,但有时这并不是一个合理的解决方案,例如,使用引用本地范围变量(或此变量)的内联lambda初始化表时 是否已经定义了对局部函数的支持,或者为什么编译器编写人员很难实现它们,因此它们不是标准的一部分?在C++11中没有局部函

e、 g:

我可以在函数体中声明类型,甚至可以将其初始化为值表。但是我不能创建一个使用该数据类型的助手函数,因为我不能在函数中声明函数,也不能在函数之外引用该数据类型,因为它只在该范围内可用

有时,从函数中提取数据类型并在其中定义我的数据类型和助手函数(本地文件范围)非常简单,但有时这并不是一个合理的解决方案,例如,使用引用本地范围变量(或此变量)的内联lambda初始化表时


是否已经定义了对局部函数的支持,或者为什么编译器编写人员很难实现它们,因此它们不是标准的一部分?

在C++11中没有局部函数

但也有lambdas


并且您的本地类型可以有成员函数

不,您不能这样做,但lambda肯定比纯本地函数更有用,因为它们还可以选择性地捕获状态?它们可以匿名使用,也可以分配给自动变量,并在任意多个位置使用


以前,另一个主要的解决方法(特别是在使用标准库算法时)是使用合适的操作符()实现定义局部函子结构。您也可以使用此方法捕获状态,但需要更多的代码来完成此操作。lambda是实现同样目标的一种非常简洁的方法。

本地函数肯定不难实现,它们至少在1968年出现在Pascal中,甚至更早。它们在GCC中作为C扩展实现

传递嵌套函数的地址要复杂一些,它通常包括设置一段代码(蹦床),首先设置静态链接/显示/任何用于访问局部变量的机制,然后执行实际的函数代码。trampoline驻留在堆栈上,这意味着堆栈必须是可执行的,并且具有通常的安全含义


C++委员会是否考虑和拒绝嵌套函数是任何人的猜测,但我建议,虽然不难实现,嵌套函数的好处并不值得付出努力。

< P>没有局部函数,但它们没有关闭,即访问局部变量,是不太有用的。在任何情况下,都可以很容易地用lambda模拟本地函数

而不是:

void foo(int x)
{
    struct S
    {
         //...
    };
    int Twice(int n, S *s) //Not allowed
    {
        return 2*n;
    }

    S s;
    int x = Twice(3, &s);
    //...
}
做:

如果捕获集为空,(
[]
)它甚至可以转换为指向函数的普通指针,就像真正的指针一样

另外,lambdas可以毫无困难地使用本地类型。但是,当然,该结构中的公共静态成员函数也可以正常工作

另外,与您的问题间接相关的是,C++11允许使用本地类型实例化模板(这在C++98中是禁止的):

void foo()
{
结构S{};
std::vector vs;//在C++98中出错,在C++11中正常
}

这相当复杂,但您可以在本地结构类型中创建本地函数:

int quadruple(int x) {
  struct Local {
    static int twice(int val) { return val * 2; }
  };
  return Local::twice(Local::twice(x));
}
请注意,局部函数没有访问局部变量的权限-您需要一个lambda。但是,它对于本地重载非常有用:

template <typename T>
T mod(T x, T y) {
  struct Local {
    static int local(int x, int y) { return x % y; }
    static double local(double x, double y) { return std::fmod(x, y); }
  };
  return Local::local(x, y);
}
模板
T模(T x,T y){
结构局部{
静态int-local(intx,inty){返回x%y;}
静态双局部(双x,双y){return std::fmod(x,y);}
};
返回本地::本地(x,y);
}

局部函数会给您带来什么,而使用
auto
+lambda无法轻松实现?局部函数比局部变量更难实现,尽管可能与lambda的实现方式相同。在完整的C++11中可能什么都没有?虽然不确定声明lambda对命名的本地。。。如果编译器能处理一个,它就能处理另一个,不是吗?我认为规则应该是类似的——除了你不能用一个本地函数捕获任何东西,所以是的,更简单……”虽然不确定adv.声明lambda比命名的本地函数有什么优势……”但主要的优势是它是合法的/受支持的,而命名的本地函数则没有。;-]@史蒂夫:“将捕获的lambda转换为普通函数指针的能力”老实说,这听起来很可怕-/
int quadruple(int x) {
  struct Local {
    static int twice(int val) { return val * 2; }
  };
  return Local::twice(Local::twice(x));
}
template <typename T>
T mod(T x, T y) {
  struct Local {
    static int local(int x, int y) { return x % y; }
    static double local(double x, double y) { return std::fmod(x, y); }
  };
  return Local::local(x, y);
}