#include <iostream>
#include <typeinfo>
typedef const int cint;
template <int a> struct x
{
static cint b = 0;
};
template <> struct x<42>
{
typedef cint b;
};
cint w = 17;
int main()
{
cint (w)(42), (z)(x<w>::b);
std::cout << typeid(z).name() << std::endl;
}
Die erste Erklärung in main()
muss eindeutig gemacht werden, so dass ein Versuch Parsing durchgeführt wird. Während dieses Parsens ist das lokale w
unbekannt, da das Parse rein syntaktisch ist (Dinge werden nur geparst, es werden keine semantischen Aktionen durchgeführt). Folglich ist w
eine globale Konstante, ihr Wert ist 17, x<w>::b
ist ein Wert und z
ist eine Variable.
Während der realen Analyse finden semantische Aktionen statt. Somit ist der Name w
an die frisch deklarierte lokale Konstante gebunden, sein Wert ist 42, x<w>::b
wird zu einem Typ, und z
ist eine Funktionsdeklaration.
Ein "Testparse" ist, wenn Sie nicht die Vollversion des Compilers kaufen. –
Siehe untenstehenden Kommentar für die eigentliche Definition von 'Trial Parse'. –