Considera il seguente programma dimostrativo.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Questo programma è compilato da Microsoft Visual Studio Community 2019
.
Ma clang
ed gcc
emettere un errore come questo
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Se scrivere l'espressione come ( 0.f ).T::~T()
allora tutti e tre i compilatori compilano il programma.
Quindi sorge una domanda: questo record è 0.f.T::~T()
sintatticamente valido? E se no, quale regola sintattica viene infranta?
(0.f).T::~T();
float f = 1.0f.t;
produrrà l'errore sul valore letterale numerico.
float
è un built-in di tipo, non ha un distruttore di chiamare. Cosa stai facendo di chiamare manualmente i distruttori? Al di fuori del posizionamento-nuovo territorio, questo dovrebbe essere un grande no-no.
0.f
e.T
fa sì che sia GCC che Clang accettino questo ...