我无法理解为什么复杂的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。
答案 0 :(得分:2)
多种原因:
sometype func{}
创建一个名为func的类型为sometype
的默认构造变量 - 因此对于您是否需要函数或变量非常不明确答案 1 :(得分:2)
Lambdas提供了一种语法,用于选择要捕获的变量以及如何捕获它们。本地函数不会使它变得不那么有用。
此外,lambdas是表达式,允许您在使用时定义简单函数,而无需单独声明。