0

次のコードを検討してください。

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 の問題ですか、それとも理解できないラムダ キャプチャの側面がありますか?

編集:以下がコンパイルされます:

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

1 に答える 1

2

これはコンパイラのバグです。

どうやら、それは 4.8.1 で修正されており、すぐにリリースされることを願っています。

于 2013-05-28T15:28:45.047 に答える