Я очень хорошо знаю, почему нужно использовать typename
для зависимых типов, поскольку компилятор не может устранить неоднозначность между объявлением типа и переменной, когда он видит что-то вроде T::type
, см., например, этот ответ для отличного объяснения. TL; DR: в выражении типа T::type * x;
компилятор не может "знать", является ли тип T::type
типом или, возможно, переменной, объявленной в определенной специализации для T
.
Однако, что-то вроде
using type = T::type;
нет ничего двусмысленного. IMO, T::type
всегда следует анализировать как тип, как часть RHS оператора using
. Однако нам все еще нужно использовать typename
здесь (по крайней мере, согласно gcc и clang),
using type = typename T::type;
Live on Coliru, gcc Live on Coliru, clang
Visual С++ кажется, принимает код без typename
, однако у меня нет слишком большой веры в то, что компилятор является полностью стандартным (на самом деле у него много нестандартных расширений, например, привязка значений r к неконстантным ссылкам).
Вопрос: Есть ли причина, по которой это не является исключением из правила typename
в С++ 11 и более поздних версиях?