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 clanget 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.
floatest 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.fet.Tamène GCC et Clang à accepter cela ...