Недавно я изменил некоторые if constexpr
на if
в своих функциях constexpr и обнаружил, что они по-прежнему работают нормально и могут быть оценены во время компиляции. Вот минимальный случай:
template<int N>
constexpr bool is_negative()
{
if constexpr (N >= 0) return false;
else return true;
}
int main()
{
constexpr bool v = is_negative<1>();
}
В приведенном выше случае N
должен быть известен во время компиляции, потому что он не является параметром шаблона типа, поэтому if constexpr
здесь отлично работает. Однако это функция constexpr, поэтому iirc возможно получить возвращаемое значение, даже если я заменяю if constexpr
на if
:
template<int N>
constexpr bool is_negative()
{
if (N >= 0) return false;
else return true;
}
int main()
{
constexpr bool v = is_negative<1>();
}
Из cppref все требования в A constexpr function must satisfy the following requirements:
не упоминают if
. Итак, IIUC, поведение constexpr должно быть определено реализацией, содержит ли функция constexpr if
для вычисления во время компиляции, даже если все связанные переменные известны во время компиляции (как is_negative
выше).
Итак, мой вывод:
- До c ++ 17 у нас не было
if constexpr
, поэтому выбор былif
, что означает, что не гарантируется выполнение наших функций constexpr во время компиляции, все зависит от реализации компилятора. - После c ++ 17 предпочтительнее использовать
if constexpr
, если мы хотим, чтобы функции constexpr оценивались во время компиляции.
Все вышесказанное - мои личные мысли, возможно, что-то важное упущено / неправильно понято, не стесняйтесь поправлять меня. Вопрос по-прежнему не изменился: if
и if constexpr
, которые следует отдавать предпочтению для функций constexpr, которые, как ожидается, будут оцениваться во время компиляции.
ссылки: - Что разрешено в функции constexpr? - Разница между if constexpr () и if ()
is_negative()
с13
создает условие13 >= 0
, и компилятор разрешит это значение до 1 (также безconstexpr
). Современные компиляторы оптимизируют все условия, но я не знаю, обязательно ли это, и если да, то с какой версии стандарта. Кстати.if (N >= 0) return true; else return false;
: почему неreturn N >= 0;
? Или это произошло из-за упрощения минимального воспроизводимого примера? - person Scheff's Cat   schedule 17.12.2018