Парсер рекурсивного спуска, инициализация переменной с самим собой, дилемма

Я хочу знать, требуется ли соответствующий компилятор C ++ для поддержки следующего кода:

int a(a);      // no other a is visible, we mean initialization of a with itself

Visual Studio 2013 не поддерживает его (необъявленный идентификатор), однако некоторые другие компиляторы компилируют его.

И вот наша дилемма: для возможной проверки выражения нам нужно располагать информацией о a (включая его тип), поскольку он может быть частью выражения, однако существует другая возможность, что это функция, в этом случае мы только конструируем выражение типа (и символ a вероятно еще не в таблице символов).

Я думаю, что анализатор рекурсивного спуска с большей вероятностью будет работать в этой дилемме, поскольку он очень структурный по своей природе, и поддержка этого конкретного случая будет походить на особый «костыль» (выражение типа создается, когда мы a внутри () и мы на каком-то уровне рекурсии). Поэтому я предполагаю, что визуальная студия использует стратегию рекурсивного спуска.

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

2

Решение

[Basic.scope.pdecl]

пункт декларации имя сразу после его завершения
декларатор (пункт 8) и до его инициализатор (если есть), кроме как
отмечено ниже. [ Пример:

unsigned char x = 12;
{ unsigned char x = x; }

Здесь второй x инициализируется своим собственным (неопределенным) значением. — конец примера]

В int a(a);Декларатор заканчивается на открывающей фигурной скобке инициализатора, так что да, компиляторы обязаны это разрешить (GCC услужливо дает -Wuninitialized предупреждение, если это автоматическая переменная).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]