gpt4 book ai didi

c++ - C++11 是否支持本地函数?

转载 作者:IT老高 更新时间:2023-10-28 13:00:03 25 4
gpt4 key购买 nike

既然 C++ 中有 lambda,我不能声明一个本地函数似乎真的很愚蠢......

例如:

我可以在函数体中声明一个类型,甚至将它初始化为一个值表。但我无法创建一个适用于该数据类型的辅助函数 - 因为我无法在函数中声明函数,也无法在函数之外引用该数据类型,因为它仅在该范围内可用。

有时将数据类型从函数中提取出来并在那里定义我的数据类型和辅助函数(本地文件范围)非常简单 - 但有时它并不是一个真正合理的解决方案 - 例如当使用引用局部范围变量(或 this)的内联 lambda 初始化表时。

知道对本地函数的支持是否即将到来,是否已经定义,或者为什么编译器编写者难以实现它们因此不是标准的一部分?

最佳答案

没有局部函数,但是没有闭包它们就没有那么有用了,即访问局部变量。在任何情况下,您都可以很容易地用 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);
//...
}

做:

void foo()
{
struct S
{
//...
};
auto Twice = [](int x, S *s) -> int //Cool!
{
return 2*x;
}; //Twice is actually a variable, so don't forget the ;


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

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

和 AFAIK 一样,lambda 可以毫无问题地使用本地类型。但是,当然,该结构中的公共(public)静态成员函数也应该可以正常工作。

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

void foo()
{
struct S {};
std::vector<S> vs; //error in C++98, ok in C++11
}

关于c++ - C++11 是否支持本地函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com