10

次のコードは gcc でコンパイルされません。

struct test {
    int x;
    test() try : x{123} {
    }
    catch (...) {
    }
};

int main() {}

エラー:

prog.cpp:3:25: error: expected unqualified-id before ‘{’ token
     test() try : x{123} {
                         ^
prog.cpp:5:5: error: expected unqualified-id before ‘catch’
     catch (...) {
     ^
prog.cpp: In constructor ‘test::test()’:
prog.cpp:3:23: error: expected ‘{’ at end of input
     test() try : x{123} {
                       ^
prog.cpp:3:23: error: expected ‘catch’ at end of input
prog.cpp:3:23: error: expected ‘(’ at end of input
prog.cpp:3:23: error: expected type-specifier at end of input
prog.cpp:3:23: error: expected ‘)’ at end of input
prog.cpp:3:23: error: expected ‘{’ at end of input

に変更x{123}するとx(123)役立ちます。これは、このように機能する (しない) ことになっていますか?

4

1 に答える 1

1

これは、標準の文法に従って有効です (中括弧については [gram.special] を、try-については [gram.except] を参照してください。GCC catch4.8 では間違っていますが、GCC 4.9 では適切に処理されます (他のコンパイラと同様に、既に行われているように)報告)。

BS が彼の本でこの構文を使用しない理由がわかりません。おそらく、彼が自分の例をコンパイルして正しいかどうかを確認したときに、この構文をサポートするコンパイラが手元になかったからでしょうか (もしそうなら)。

于 2013-10-07T13:21:23.483 に答える