Подтвердить что ты не робот

Пример параметра шаблона С++ 11 misbind?

В 6.8.3 стандарта С++ 11 говорится:

Если, во время разбора имя в параметре шаблона связано иначе, чем оно было бы связано во время пробной версии разбор, программа плохо сформирована.

Что такое пример плохой формы в результате этого требования?

4b9b3361

Ответ 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 является объявлением функции.