Выбор ответа Senior Шаблоны и концепты обновлено
if constexpr в шаблоне
Вопрос
Чем if constexpr в шаблоне функции отличается от обычного if с константным условием?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Отброшенная ветка не инстанцируется для данного T. При обычном if обе ветки должны компилироваться для каждого T, даже если одна никогда не выполнится. if constexpr отбрасывает ветку на этапе инстанцирования, поэтому в ветке для арифметических типов можно вызывать std::tostring, а в ветке…
Варианты ответа
- Ничем: оптимизатор и так удалит ветку с константным условием
if constexprвыполняется быстрее в рантайме за счёт кеша- Отброшенная ветка не инстанцируется для данного
Tправильный ответ - Обе ветки компилируются для каждого
T, но одна не выполняется
Разбор
При обычном if обе ветки должны компилироваться для каждого T, даже если одна никогда не выполнится. if constexpr отбрасывает ветку на этапе инстанцирования, поэтому в ветке для арифметических типов можно вызывать std::to_string, а в ветке для строк методы строк.
- Оптимизатор удаляет мёртвый код уже после проверки типов, это не спасает от ошибок компиляции.
- В рантайме разницы нет: условие и так константное.
- Отброшенная ветка как раз не компилируется (для зависимых конструкций).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Шаблоны и концепты»
- Дерево отрезков с операцией как параметром шаблона
- Обобщённая функция статистики для чисел и строк
- Один бинарный поиск на все случаи: предикат как параметр шаблона
- Зачем концепты
- Концепты против SFINAE
- Вывод аргументов шаблона класса
- Вывод T при передаче по значению
- Член зависимой базы