Betrachten Sie das folgende Demonstrationsprogramm.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Dieses Programm wird zusammengestellt von Microsoft Visual Studio Community 2019
.
Aber clang
und gcc
geben Sie einen Fehler wie diesen aus
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Wenn der Ausdruck wie ( 0.f ).T::~T()
folgt geschrieben werden soll, kompilieren alle drei Compiler das Programm.
Es stellt sich also die Frage: Ist dieser Datensatz 0.f.T::~T()
syntaktisch gültig? Und wenn nicht, welche syntaktische Regel ist dann gebrochen?
(0.f).T::~T();
float f = 1.0f.t;
wird den Fehler über das numerische Literal erzeugen.
float
ist ein eingebauter Typ, es gibt keinen Destruktor, den Sie aufrufen können. Was machst du überhaupt, wenn du Destruktoren manuell aufrufst? Außerhalb von Neuland sollte dies ein großes Nein-Nein sein.
0.f
und setzen, werden.T
GCC und Clang dies akzeptieren ...