«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему я не могу использовать if constexpr в нешаблонных функциях в C++17?

Почему я не могу использовать if constexpr в нешаблонных функциях в C++17?

Опубликовано 26 ноября 2024 г.
Просматривать:613

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

C 17 "if constexpr" ограничен шаблонными функциями

В C 17 введение "if constexpr" вызвало интерес к его способность условно выполнять код на основе констант времени компиляции. Однако при попытке использовать его в нешаблонных функциях возникает проблема.

Рассмотрите следующий код:

#include 
#include 

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v)
    std::cout 

Хотя этот код компилируется без ошибок в шаблонных функциях, он завершается с ошибкой компиляции при помещении в нешаблонную функцию, такую ​​как print. Причина кроется в поведении «if constexpr».

«if constexpr» предназначен для условной компиляции кода шаблона. В шаблонной функции компилятор определяет тип параметра во время компиляции, позволяя выбрать соответствующий путь кода на основе типа. В этом случае, когда функция печати является шаблонной, она может определить, является ли значение указателем во время компиляции, и выполнить соответствующую ветку кода.

Однако в нешаблонной функции тип значения известен только во время выполнения, что делает «if constexpr» неэффективным. Компилятор обрабатывает обе ветви условного оператора как исполняемый код, что приводит к ошибке компиляции при попытке разыменовать значение в Ptr для перехода к ветви, когда значение является целым числом.

Чтобы избежать этой проблемы, необходимо поместить " if constexpr" внутри функции-шаблона или предоставить явную информацию о типе нешаблонной функции, чтобы гарантировать вывод типа во время компиляции.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3