我已经阅读了 C++ 中 lambda 表达式的解释,并且了解了它们是如何工作的,以及需要如何声明 lambda 表达式(省略了许多细节):
lambda-captureopt[
]
参数声明子句(
复合语句。)
我发现你可以在另一个 lambda 定义中以如下方式定义 lambda:
[lambda1{[](){
return 123;
}}]{
return lambda1();
}
这有效:
cout << [lambda1{[](){
return 123;
}}]{
return lambda1();
}();
这个没有:
cout << prova{[](){
return "hello";
}}();
为什么我可以在第二个示例中像
lambda1{...}
那样定义它,而不是在第三个示例中?
在第二个示例中,
[lambda1{[](){...}}]{...}
您会看到标识符lambda1
出现在括号[]
中,括号是 lambda 的捕获列表。这是一个可以声明 new 标识符 lambda1
的上下文。
在第三个示例中,标识符
prova
出现时没有任何“特殊”上下文,特别是不能声明新标识符的上下文。因此,以通常的方式查找它,如果没有找到,则出现错误。