#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;
}
Pierwsza deklaracja w main()
należy ujednoznacznione, więc parse trial jest wykonywana. Podczas tego przetwarzania lokalny w
jest nieznany, ponieważ parsowanie jest czysto syntaktyczne (rzeczy są analizowane, nie są wykonywane żadne działania semantyczne). W konsekwencji w
jest stałą globalną, jej wartość to 17, x<w>::b
jest wartością, a z
jest zmienną.
Podczas prawdziwej analizy wykonywane są akcje semantyczne. Dlatego nazwa w
jest powiązana ze świeżo zadeklarowaną stałą lokalną, jej wartość wynosi 42, x<w>::b
staje się typem, a z
jest deklaracją funkcji.
"Analiza próbna" dotyczy sytuacji, gdy nie kupisz pełnej wersji kompilatora. –
Zobacz komentarz poniżej do faktycznej definicji "analizy próbnej". –