2013-09-07 1 views
11

following code не компилируется с GCC:не может использовать единообразного инициализации в списке инициализации конструктора с Try/уловом

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) помогает. Предполагается ли это (не) работать таким образом?

+2

Clang [скомпилирует его] (http://coliru.stacked-crooked.com/a/0e8921393e3a52f1) без ошибок – Praetorian

+3

Все, что связано с фигурными скобками и C++ 11, очень вероятно, не полностью в течение некоторого времени выполняли угловые случаи в компиляторах ... –

+3

@KerrekSB Я думал, что это ошибка, но в книге Страустрапа он использует единую инициализацию в конструкторах, за исключением случаев, когда есть попытка/уловка, так что меня это озадачило. – catscradle

ответ

1

Это действует в соответствии с грамматикой стандарта (см [gram.special] для скобок, и [gram.except] для try -. catch GCC 4.8 имеет это неправильно, но GCC 4.9 обрабатывает его должным образом (как делать другие компиляторы, как уже сообщалось).

Я понятия не имею, почему BS не использует этот синтаксис в своей книге. Возможно, потому, что у него не было никакого компилятора, который поддерживал этот синтаксис, когда он составлял свои примеры, чтобы увидеть если они правы (если он это сделал)?

 Смежные вопросы

  • Нет связанных вопросов^_^