Я хочу знать, является ли соответствующий компилятор C++ требуется поддерживать следующий код:рекурсивный спуск парсер, инициализация переменной с самим собой, дилемма
int a(a); // no other a is visible, we mean initialization of a with itself
Visual Studio 2013 не поддерживает его (необъявленный идентификатор), однако некоторые компиляторы компилируют его.
И вот наша дилемма: для возможной проверки выражения нам необходимо распорядиться информацией о a
(включая его тип), поскольку она может быть частью выражения, однако есть и другая возможность, что она является функцией, в этом случае мы только выражение типа построения (и символ a
, вероятно, еще не находится в таблице символов).
Я думаю, что рекурсивный парсер спуска, скорее всего, столкнется с этой дилеммой, поскольку он является очень структурным по своей природе, и поддержка этого конкретного случая будет похожа на специальный «костыль» (выражение типа строится, когда мы сталкиваемся с a
внутри ()
, и мы находимся на определенном уровне рекурсии). Поэтому я предполагаю, что визуальная студия использует рекурсивную стратегию спуска.
Итак, имея в виду, стоит ли прилагать усилия автора-писателя и оправдан ли поддерживать такой код (особенно при использовании рекурсивного спуска)?
У вас есть UB для инициализации 'a' с еще не инициализированным' a'. – Jarod42
, но вы можете иметь 'void * p (&p); // Имеет свой собственный адрес'. – Jarod42
Пример' int x = x; 'в 3.3.2, кажется, указывает, что это законно, и соответствующий компилятор должен его принять. Http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf – Henrik