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

时间:2018-12-17 12:24:43

标签: c++

有什么方法可以在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.

3 个答案:

答案 0 :(得分:15)

  

在lambda表达式中可以使用goto语句吗?

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

话虽这么说,C ++中goto的用法很少而且很少见。还有其他更好选项。我敦促您不要将goto作为您使用的第一个工具。

答案 1 :(得分:9)

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

来自this reference

  

goto语句必须与它所引用的标签具有相同的功能,它可能出现在标签之前或之后。

还有the standard, [stmt.goto]

  

goto语句无条件地将控制权转移到由标识符标记的语句。标识符应该是当前函数中的标签。

答案 2 :(得分:5)

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

您可以改为执行此操作:

#include <iostream>

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

}

它将打印“ Hello World”。参见demo