(14.6.2 temp.dep) неявно предполагается как имя типа. "

+typename необходимо ключевое слово, чтобы компилятор мог различать между вложенными типами и вложенными значениями в шаблонах. Однако существуют определенные ситуации, когда двусмысленность невозможна, например, когда производный класс наследует от вложенного типа класса.

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

Здесьtypename Ключевое слово не требуется, и фактически даже не допускается. Это имеет смысл, потому что контекст устраняет неоднозначность. Вот,T::type должен ссылаться на тип, поскольку вы явно не можете наследовать от значения.

Я думаю, что то же самое будет справедливо для параметров шаблона функции.

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

}

В этом случае из контекста становится ясно, чтоT::type должен ссылаться на тип, поскольку параметр функции не может быть значением. Тем не менее, компилятор не принимает это. Хочетconst typename T::type&, Это кажется противоречивым. Почему язык допускает неявное предположение о вложенном типе в контексте наследования, ноне в контексте параметров функции? В обоих случаях не может быть никакой двусмысленности, так почему необходимостьtypename в одном, а не в другом?

Ответы на вопрос(3)

Ваш ответ на вопрос