Ответ 1
TL;DR Clang и GCC верны, вы не можете написать a .
сразу после определения пользователем целочисленного/плавающего литерала, это ошибка MSVC.
Когда программа компилируется, она идет по 9 фазам переводов по порядку. Ключевым моментом здесь является лексирование (разделение) исходного кода на токены, прежде чем принимать во внимание его семантический смысл.
На этой фазе действует максимальный munch, т. Е. Токены принимаются как самая длинная последовательность символов, которая синтаксически действительна. Например, x+++++y
лексируется как x ++ ++ + y
вместо x + ++ ++ y
даже если первое не является семантически правильным.
Вопрос в том, что является самой длинной синтаксически допустимой последовательностью для 123_foo.bar
. Следуя правилам производства для номера предварительной обработки, точная последовательность
pp-number → идентификатор pp-number-nondigit →... → идентификатор числа pp-nondigit³ →
pp-number nondigit³ → pp-number. nondigit³ →... → pp-number nondigit⁴. nondigit³ →
pp-number digit nondigit⁴. nondigit³ →... → pp-number digit² nondigit⁴. nondigit³ →
digit³ nondigit⁴. nondigit³
Что разрешает 123_foo.bar
как видно из сообщения об ошибке