Я хочу знать, требуется ли соответствующий компилятор C ++ для поддержки следующего кода:
int a(a); // no other a is visible, we mean initialization of a with itself
Visual Studio 2013 не поддерживает его (необъявленный идентификатор), однако некоторые другие компиляторы компилируют его.
И вот наша дилемма: для возможной проверки выражения нам нужно располагать информацией о a
(включая его тип), поскольку он может быть частью выражения, однако существует другая возможность, что это функция, в этом случае мы только конструируем выражение типа (и символ a
вероятно еще не в таблице символов).
Я думаю, что анализатор рекурсивного спуска с большей вероятностью будет работать в этой дилемме, поскольку он очень структурный по своей природе, и поддержка этого конкретного случая будет походить на особый «костыль» (выражение типа создается, когда мы a
внутри ()
и мы на каком-то уровне рекурсии). Поэтому я предполагаю, что визуальная студия использует стратегию рекурсивного спуска.
Итак, учитывая все это, стоит ли усилий автора компилятора и оправданно ли поддерживать такой код (особенно при использовании рекурсивного спуска)?
пункт декларации имя сразу после его завершения
декларатор (пункт 8) и до его инициализатор (если есть), кроме как
отмечено ниже. [ Пример:unsigned char x = 12; { unsigned char x = x; }
Здесь второй x инициализируется своим собственным (неопределенным) значением. — конец примера]
В int a(a);
Декларатор заканчивается на открывающей фигурной скобке инициализатора, так что да, компиляторы обязаны это разрешить (GCC услужливо дает -Wuninitialized
предупреждение, если это автоматическая переменная).
Других решений пока нет …