Выбор ответа Middle Шаблоны и концепты обновлено

Зачем typename

Вопрос

Почему внутри шаблона пишут typename T::iterator it;?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Иначе зависимое имя T::iterator считается значением, а не типом данных. До инстанцирования компилятор не знает, чем окажется T::iterator: типом, статическим членом или функцией.

Варианты ответа

  1. Это необязательное украшение для читаемости, компилятор его игнорирует
  2. typename делает переменную it константой на время инстанцирования
  3. Так внутри функции объявляется новый параметр шаблона по имени it
  4. Иначе зависимое имя T::iterator считается значением, а не типом данныхправильный ответ

Разбор

До инстанцирования компилятор не знает, чем окажется T::iterator: типом, статическим членом или функцией. По правилам он считает его не типом, если явно не сказано typename. В C++20 правило ослабили для некоторых контекстов (например, возвращаемый тип), но в объявлении переменной typename по-прежнему нужен.

  • Без него будет ошибка компиляции.
  • К константности не относится.
  • Параметр шаблона объявляется в template <...>, а здесь объявляется переменная.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.