Rozważ następujący program demonstracyjny.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Ten program jest kompilowany przez Microsoft Visual Studio Community 2019.
Ale clangi gccpoproś o taki błąd
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Jeśli napiszesz takie wyrażenie, ( 0.f ).T::~T()to wszystkie trzy kompilatory skompilują program.
Powstaje więc pytanie: czy ten rekord jest 0.f.T::~T()poprawny pod względem składniowym? A jeśli nie, to jaka zasada składniowa jest złamana?
(0.f).T::~T();
float f = 1.0f.t;spowoduje błąd dotyczący literału liczbowego.
floatjest wbudowanym typem, nie ma destruktywatora do wywołania. Co robisz nawet ręcznie wywołując destruktory? Poza nowym miejscem docelowym powinno być duże nie-nie.
0.fi.Tpowoduje, że zarówno GCC, jak i Clang to zaakceptują ...