为什么可以使用 lambda 表达式的捕获列表中的名称定义 lambda,但不能在其外部定义名称?

Lor*_*ada 4 c++ syntax lambda

我已经阅读了 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{...},而不是第三个例子?

j6t*_*j6t 5

在第二个示例中,[lambda1{[](){...}}]{...}您会看到标识符lambda1出现在[]作为 lambda 捕获列表的括号内。这是一个可以声明标识符 的上下文。lambda1

在第三个示例中,标识符prova在没有任何“特殊”上下文的情况下出现,特别是没有可以声明新标识符的上下文。因此,以通常的方式查找它,如果没有找到,则出现错误。

  • `[lambda1{[](){}}] {...}` 只是 `[lambda1 = [](){}] {...}` 的另一种编写方式,就像 `[x = 0 ] {...}`。 (2认同)