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