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