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

问题描述 投票:0回答:1

我已经阅读了 C++ 中 lambda 表达式的解释,并且了解了它们是如何工作的,以及需要如何声明 lambda 表达式(省略了许多细节):

[
lambda-captureopt
]
(
参数声明子句
)
复合语句

我发现你可以在另一个 lambda 定义中以如下方式定义 lambda:

[lambda1{[](){
    return 123;
}}]{
    return lambda1();
}

这有效:

cout << [lambda1{[](){
    return 123;
}}]{
    return lambda1();
}();

这个没有:

cout << prova{[](){
    return "hello";
}}();

为什么我可以在第二个示例中像

lambda1{...}
那样定义它,而不是在第三个示例中?

c++ lambda syntax
1个回答
2
投票

在第二个示例中,

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

在第三个示例中,标识符

prova
出现时没有任何“特殊”上下文,特别是不能声明新标识符的上下文。因此,以通常的方式查找它,如果没有找到,则出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.