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 clang
i gcc
poproś 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.
float
jest 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.f
i.T
powoduje, że zarówno GCC, jak i Clang to zaakceptują ...