Как я могу использовать std::is_constant_evaluated() без генерации предупреждения [дубликат]C++

Программы на C++. Форум разработчиков
Anonymous
Как я могу использовать std::is_constant_evaluated() без генерации предупреждения [дубликат]

Сообщение Anonymous »

Насколько я понимаю, std::is_constant_evaluated() заключается в том, что его можно использовать в качестве условия в операторе if constexpr для вызова функции constexpr во время компиляции и быстрой функции во время выполнения. Я считаю, что это соответствует https://gist.github.com/Som1Lse/5309b11 ... fd803ba9d2
У меня есть следующий код

Код: Выделить всё

template 
constexpr T myAbs(const T &value)
{
if constexpr (std::is_constant_evaluated())
return value < TypeTraits::zero ? -value : value;
else
{
return T(std::abs(value.getValueAsDouble()));
}
}

Цель состоит в том, чтобы использовать условное выражение во время компиляции, что может быть медленным, но является constexpr, а затем использовать std::abs во время выполнения, который затем сможет выполнить какое-то быстрое присвоение битов или что-то еще во время выполнения. Я использую C++20, поэтому std::abs не является constexpr. В рамках модульного тестирования я вызываю myAbs со static_assert

Код: Выделить всё

MyClass positive(5.0);
MyClass negative(-5.0);
static_assert (myAbs(positive) == positive, "Abs of a positive Physical should be itself");
static_assert (myAbs(negative) == positive, "Abs of a negative Physical should be the negative of itself");
В Visual Studio 2022 я получаю предупреждение

Код: Выделить всё

warning C5063: 'std::is_constant_evaluated' always evaluates to true in manifestly constant-evaluated expressions
Насколько я понимаю, я использую std::is_constant_evaluated() по назначению, но, возможно, это не так. Может ли кто-нибудь сказать мне, как мне его использовать, чтобы избежать этого предупреждения компилятора?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -a-warning

Вернуться в «C++»