gpt4 book ai didi

c++ - 为什么是 lambda 而不是局部函数?

转载 作者:行者123 更新时间:2023-11-30 01:49:03 25 4
gpt4 key购买 nike

我不明白为什么要将复杂的 lambda 语法添加到“C++11”中,而不是只允许定义局部函数。换句话说,为什么会这样:

int main()
{
auto lambda = []() { };
}

不是这个:

int main()
{
void lambda() { }
}

我猜你会指出这是因为局部函数在表达式中不可用,但事实并非如此,因为支持这种形式的语法可以通过启用临时函数非常直观地轻松添加。像这样:

int main()
{
void func(auto callable) ;

func( (void ()) { } ); //here we are basically creating a temporary of function type
}

好的。假设我们以这种方式通过值或引用指定捕获(与当前的 lambda 非常相似):

[捕获列表] 函数声明

因为捕获列表将具有与描述的完全相同的语义 here .

所以它会像这样看练习:

int main()
{
int tmp;

void func(auto callable) ;

func( ([tmp]void ()) { } ); //here 'tmp' is captured by value

[&] void func1() { } //here all locals are captured by reference

void func2() { } //same as above
}

但它仍然是一个函数定义,而不是一个对象定义。

请注意 void func(auto callable) 不是 lambda 函数,而是全局函数的声明。只有当它被定义到另一个函数中时,它才变成 lambda。

只是为了给出一个工作示例来证明这实际上是可以实现的,我将使用 GCC 'C',它通过扩展支持类似的语法:

生活 Example .

最佳答案

多种原因:

  • Lambda 提供“捕获”语法 - 您可以按值或引用捕获、移入捕获参数、命名捕获参数等
  • 函数中的语法 sometype func{} 会创建一个名为 func 且类型为 sometype 的默认构造变量 - 因此对于您想要函数还是变量
  • Lambda 通常更接近仿函数的简写而不是函数的简写(任何时候有捕获)

关于c++ - 为什么是 lambda 而不是局部函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653355/

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