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

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

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

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

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

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

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

1 ответ

[Basic.scope.pdecl]

Пункт объявления для имени находится сразу после его полного декларатора (пункт 8) и до его инициализатора (если таковой имеется), за исключением случаев, указанных ниже. [ Пример:

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

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

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

Другие вопросы по тегам