Выбор ответа Middle Шаблоны и концепты обновлено
Зачем typename
Вопрос
Почему внутри шаблона пишут typename T::iterator it;?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Иначе зависимое имя T::iterator считается значением, а не типом данных. До инстанцирования компилятор не знает, чем окажется T::iterator: типом, статическим членом или функцией.
Варианты ответа
- Это необязательное украшение для читаемости, компилятор его игнорирует
typenameделает переменнуюitконстантой на время инстанцирования- Так внутри функции объявляется новый параметр шаблона по имени
it - Иначе зависимое имя
T::iteratorсчитается значением, а не типом данныхправильный ответ
Разбор
До инстанцирования компилятор не знает, чем окажется T::iterator: типом, статическим членом или функцией. По правилам он считает его не типом, если явно не сказано typename. В C++20 правило ослабили для некоторых контекстов (например, возвращаемый тип), но в объявлении переменной typename по-прежнему нужен.
- Без него будет ошибка компиляции.
- К константности не относится.
- Параметр шаблона объявляется в
template <...>, а здесь объявляется переменная.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Шаблоны и концепты»
- Дерево отрезков с операцией как параметром шаблона
- Обобщённая функция статистики для чисел и строк
- Один бинарный поиск на все случаи: предикат как параметр шаблона
- Зачем концепты
- Концепты против SFINAE
- Вывод аргументов шаблона класса
- Вывод T при передаче по значению
- Член зависимой базы