Синтаксический анализ числовых токенов довольно грубый и допускает множество вещей, которые на самом деле не являются действительными числами. В C ++ 98 грамматика для «числа предварительной обработки», найденного в [lex.ppnumber], равна
pp-number:
digit
. digit
pp-number digit
pp-number nondigit
pp-number e sign
pp-number E sign
pp-number .
Здесь «nondi git» - это любой символ, который можно использовать в идентификатор, отличный от цифр, и «знак» - это либо +, либо -. Более поздние стандарты будут расширять определение, чтобы разрешить одинарные кавычки (C ++ 14) и последовательности в форме p-, p +, P-, P + (C ++ 17).
В результате в любой версии стандарта, хотя номер предварительной обработки должен начинаться с ди git или с точки, за которой следует ди git, после чего может следовать произвольная последовательность цифр, букв и периодов. Из правила максимального мунка следует, что 0.f.T::~T();
требуется для токенизации как 0.f.T :: ~ T ( ) ;
, хотя 0.f.T
не является допустимым числовым токеном.
Таким образом, код не синтаксически действителен.