Ответ 1
#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;
}
Первое объявление в main()
должно быть устранено, поэтому выполняется синтаксический анализ. Во время этого разбора локальный w
неизвестен, поскольку синтаксический анализ является чисто синтаксическим (вещи разбираются только, семантические действия не выполняются). Следовательно, w
является глобальной константой, ее значение равно 17, x<w>::b
- значение, а z
- переменная.
Во время реального разбора происходят семантические действия. Таким образом, имя w
привязано к только что объявленной локальной константе, его значение равно 42, x<w>::b
становится типом, а z
является объявлением функции.