Considere el siguiente programa demostrativo.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Este programa está compilado por Microsoft Visual Studio Community 2019
.
Pero clang
y gcc
emitir un error como este
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Si escribir la expresión como ( 0.f ).T::~T()
entonces, los tres compiladores compilan el programa.
Entonces surge una pregunta: ¿es este registro 0.f.T::~T()
sintácticamente válido? Y si no, ¿qué regla sintáctica se rompe?
(0.f).T::~T();
float f = 1.0f.t;
producirá el error sobre el literal numérico.
float
es un tipo incorporado , no tiene un destructor al que pueda llamar. ¿Qué haces incluso llamando a destructores manualmente? Fuera del territorio de ubicación nueva, eso debería ser un gran no-no.
0.f
y.T
hace que tanto GCC como Clang acepten esto ...