2013-05-28 24 views
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; 

    } 

}; 
+0

警告是预期的,因为捕捉模式是按值('=')。将其更改为通过引用('&lambda')显式捕获lambda,并且警告应该消失。 –

+0

你读过这个问题吗,还是我完全错过了你的观点? –

+0

你错过了我的观点。我只是让你知道这个警告是预料之中的,以及如何摆脱它。如果我能够验证这个问题是一个错误(迈克打败了我),我会发布一个更深入的描述为什么发生的答案。 –

回答