在另一个lambda中调用catch块中捕获的lambda会产生GCC错误

Calling captured lambda in catch block in another lambda yields GCC error

本文关键字:lambda GCC 错误 调用 另一个 catch      更新时间:2023-10-16

考虑以下代码:

auto lambda=[] () { std::cout << "Error occurred!" << std::endl;    };
auto lambda_2=[=/*,lambda*/] () {
    try {
        //  Do something
        std::cout << (2+2) << std::endl;
    } catch (...) {
        lambda();
        throw;
    }
};

我的期望:这个代码可以编译。

Reality (MinGW 4.8.0):

main.cpp: In lambda function:
main.cpp:27:5: error: '...' handler must be the last handler for its try block [
-fpermissive]
   } catch (...) {
     ^

如果取消注释lambda的显式副本捕获,代码将编译,但是这会发出警告:

main.cpp:20:19: warning: explicit by-copy capture of 'lambda' redundant with by-
copy capture default [enabled by default]
  auto lambda_2=[=,lambda] () {
                   ^

这是GCC的问题,还是lambda捕获的某些方面我不理解?

EDIT:以下编译:

auto lambda=[] () { std::cout << "Error occurred!" << std::endl;    };
auto lambda_2=[&] () {
    try {
        //  Do something
        std::cout << (2+2) << std::endl;
    } catch (...) {
        try {
            lambda();
        } catch (...) { }
        throw;
    }
};

这是一个编译器错误。

显然,它在4.8.1中得到了修复,有望很快发布。