如何在 lambda 表达式C++中使用 goto 语句

How to use goto statement in lambda expression C++

本文关键字:goto 语句 C++ lambda 表达式      更新时间:2023-10-16

有什么方法可以在lambda表达式中使用goto语句吗?

#include <iostream>
int main()
{
auto lambda = []() {
goto label;
return;
};
lambda();
return 0;
label:
std::cout << "hello, world!" << std::endl;
}

我希望控制台输出hello,world!,但编译器给出了一个错误:

use of undeclared label 'label'
goto label;
^
1 error generated.

有什么方法可以在 lambda 表达式中使用 goto 语句吗?

不。不要离开 lambda 的范围并跳到封闭范围。您只能在 lambda 中goto带标签的语句,就像它是任何其他函数一样。

话虽如此,goto在C++中的用途很少且很少见。还有其他更好的选择。我敦促你不要把goto作为你使用的第一个工具。

您不能使用goto在函数之间移动,并且 lambda 为其封闭范围定义了一个单独的函数。

从这个参考

goto语句必须与它所引用的标签处于同一功能中,它可能出现在标签之前或之后。

而标准,[stmt.goto]

goto语句无条件地将控制权移交给由标识符标记的语句。标识符应为位于当前函数中的标签。

goto语句将控制权转移到 label 指定的位置。goto语句必须与它所引用的标签处于同一功能中,它可以出现在标签之前或之后。

您可以改为执行以下操作:

#include <iostream>
int main()
{
auto lambda = []() {
goto label;        
return;
label:
std::cout << "hello, world!" << std::endl;        
};
lambda();
return 0;
}

它将打印"你好世界"。请参阅演示。