В общем, C ++ нуждается в typename
из-за неудачного синтаксиса [*], который он наследует от C, что делает невозможным без нелокальной информации сказать - например - в A * B;
, есть ли A
имена тип (в этом случае это объявление B
в качестве указателя на него) или нет (в этом случае это выражение умножения - вполне возможно, начиная с A
, для всего, что вы можете сказать без нелокальной информации , может быть экземпляром класса, который перегружает operator*
, чтобы сделать что-то странное; -).
В большинстве случаев компилятор имеет нелокальную информацию, необходимую для устранения неоднозначности (хотя неудачный синтаксис по-прежнему означает, что низкоуровневому синтаксическому анализатору требуется обратная связь от высокоуровневого слоя, который хранит информацию таблицы символов) ... но с шаблонов это не делает (не в целом, хотя в этом конкретном случае это может быть технически незаконно специализировать std::list<T>
, так что его ::iterator
НЕ является именем типа; -).
[*] не только мое мнение, но и мнение Кена Томпсона и Роба Пайкса, в настоящее время моих коллег, которые заняты разработкой и реализацией нового языка программирования для внутреннего использования: этот новый язык программирования, в то время как его синтаксис в основном C-like, НЕ повторяет ошибки проектирования синтаксиса C - это новый язык (например, в старом добром Pascal), синтаксис достаточен для того, чтобы отличить идентификаторы, которые должны называть тип, от идентификаторов, которые не должны; -).