Considérez le programme de démonstration suivant.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Ce programme est compilé par Microsoft Visual Studio Community 2019
.
Mais clang
et gcc
émettre une erreur comme celle-ci
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Si pour écrire l'expression comme ( 0.f ).T::~T()
alors, les trois compilateurs compilent le programme.
Une question se pose donc: cet enregistrement est-il 0.f.T::~T()
syntaxiquement valide? Et sinon, quelle règle syntaxique est violée?
(0.f).T::~T();
float f = 1.0f.t;
produira l'erreur sur le littéral numérique.
float
est un type intégré , il n'a pas de destructeur à appeler. Que faites-vous même d'appeler manuellement des destructeurs? En dehors du placement-nouveau territoire, cela devrait être un grand non-non.
0.f
et.T
amène GCC et Clang à accepter cela ...