2013-09-07 9 views
11

following code nie skompilować z gcc:nie można używać jednolitego inicjalizacji w liście inicjującej konstruktora z try/catch

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

int main() {} 

błędów:

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 

Zmiana x{123} do x(123) pomaga. Czy to ma (nie) działać w ten sposób?

+2

Clang [kompiluje to] (http://coliru.stacked-crooked.com/a/0e8921393e3a52f1) bez błędów – Praetorian

+3

Wszystko, co można zrobić z aparatami ortodontycznymi i C++ 11 jest bardzo może mieć niepełne i wstawione narożne przypadki kompilatorów przez jakiś czas ... –

+3

@KerrekSB Myślałem, że to błąd na początku, ale w książce Stroustrupa używa on jednolitej inicjalizacji w konstruktorach, z wyjątkiem sytuacji, gdy jest próba/catch, więc to mnie trochę zaintrygowało. – catscradle

Odpowiedz

1

To jest ważne zgodnie z gramatyki standardu (patrz [gram.special] za szelki i [gram.except] dla try. - catch GCC 4.8 ma to źle, ale GCC 4.9 obsługuje je prawidłowo (jak do innych kompilatorów, jak już informowaliśmy)

Nie mam pojęcia, dlaczego BS nie używa tej składni w swojej książce. Może dlatego, że nie miał pod ręką żadnego kompilatora, który obsługiwałby tę składnię, gdy kompilował swoje przykłady, aby zobaczyć jeśli mają rację (jeśli zrobił to)?

Powiązane problemy