Почему SFINAE сбивается при смене места специализации шаблона класса? Является ли это ошибкой C++?

Следующий код выдает ожидаемую ошибку компилятора (Демо):

  1 template struct Range;
  2 
  3 template > struct Unique;
  4 template struct Unique 1)> > { typedef char type[1]; };
  5 template struct Unique 2)> > { typedef char type[2]; };
  6 
  7 Unique<3>::type o1;
  8 Unique<3>::type o2;

Теперь, если я поменяю местами строку-5 и строку-7. Тогда НЕТ ошибки компилятора !! Демо.

  5 Unique<3>::type o1;

  7 template struct Unique 2)> > { typedef char type[2]; };

Для o1 понятно, что ошибки нет, потому что специализация для (значение > 2) еще не видна. Но почему нет ошибки и для o2, который видит 2 совпадающие специализации !?
Я предполагаю, что компилятор должен выбрать Unique::type с каким-то произвольным именем, когда он встречается в первый раз, а затем заменить Unique::type везде с этим именем.

Это ошибка компиляции, или ошибка C++, или C++ "feature" ?

6
задан iammilind 6 March 2012 в 10:42
поделиться