Uso da palavra-chave typename com parâmetros de função do modelo

Em C ++, otypename é necessária para que o compilador possa desambiguar entre tipos e valores aninhados em modelos. No entanto, há certas situações em que nenhuma ambiguidade é possível, como quando uma classe derivada herda de um tipo de classe aninhada.

template <class T>
class Derived : public T::type
{ };

Aqui otypename&nbsp;palavra-chave não é necessária e, de fato, nem é permitida. Isso faz sentido, porque o contexto remove a ambiguidade. Aqui,T::type&nbsp;deve se referir a um tipo, pois você obviamente não pode herdar de um valor.

Eu pensaria que o mesmo seria válido para os parâmetros do modelo de função.

template <class T>
void foo(const T::type& v)
{

}

Nesse caso, o contexto deixa claro queT::type&nbsp;deve se referir a um tipo, pois um parâmetro de função não pode ser um valor No entanto, o compilador não aceita isso. Querconst typename T::type&. Isso parece inconsistente. Por que a linguagem permite a suposição implícita de um tipo aninhado no contexto da herança, masnão&nbsp;no contexto de parâmetros de função? Em ambos os casos, não pode haver ambiguidade, por que a necessidade detypename&nbsp;em um, mas não no outro?