0
考虑以下代码:调用在另一个lambda catch块捕获拉姆达产生GCC错误
auto lambda=[]() { std::cout << "Error occurred!" << std::endl; };
auto lambda_2=[=/*,lambda*/]() {
try {
// Do something
std::cout << (2+2) << std::endl;
} catch (...) {
lambda();
throw;
}
};
我的期望:此代码编译。
现实(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捕获的方面我不理解?
编辑:以下编译:
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;
}
};
警告是预期的,因为捕捉模式是按值('=')。将其更改为通过引用('&lambda')显式捕获lambda,并且警告应该消失。 –
你读过这个问题吗,还是我完全错过了你的观点? –
你错过了我的观点。我只是让你知道这个警告是预料之中的,以及如何摆脱它。如果我能够验证这个问题是一个错误(迈克打败了我),我会发布一个更深入的描述为什么发生的答案。 –