为什么lambda而不是本地函数?

时间:2015-04-15 14:44:07

标签: c++ c++11 lambda

我无法理解为什么复杂的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):

[ capture-list ] function-declaration

因为捕获列表将具有与描述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

2 个答案:

答案 0 :(得分:2)

多种原因:

  • Lambdas提供'捕获'的语法 - 您可以通过值或引用捕获,移动到捕获参数,名称捕获参数等等。
  • 函数中的语法sometype func{}创建一个名为func的类型为sometype的默认构造变量 - 因此对于您是否需要函数或变量非常不明确
  • Lambdas 通常更接近仿函数的速记而不是函数的速记(任何时候有捕获)

答案 1 :(得分:2)

Lambdas提供了一种语法,用于选择要捕获的变量以及如何捕获它们。本地函数不会使它变得不那么有用。

此外,lambdas是表达式,允许您在使用时定义简单函数,而无需单独声明。