Considere o seguinte programa demonstrativo.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Este programa é compilado por Microsoft Visual Studio Community 2019
.
Mas clang
e gcc
emita um erro como este
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Se escrever a expressão assim ( 0.f ).T::~T()
, todos os três compiladores compilarão o programa.
Então surge uma pergunta: esse registro é 0.f.T::~T()
sintaticamente válido? E se não, então que regra sintática está quebrada?
(0.f).T::~T();
float f = 1.0f.t;
produzirá o erro sobre o literal numérico.
float
é um tipo embutido , não possui um destruidor para você chamar. O que você está fazendo manualmente chamando destruidores? Fora do território de colocação de novo, isso deve ser um grande não-não.
0.f
e.T
faz com que o GCC e o Clang aceitem isso ...