Подтвердить что ты не робот

Не может использовать единую инициализацию в списке инициализации конструктора с помощью try/catch

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

4b9b3361

Ответ 1

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

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