Почему std::isnan(IntegralType arg) приводит arg к двойному?
Интегральный тип не может быть NaN, насколько я понимаю, поэтому
std::isnan
может просто вернуться
false
при заданном интегральном типе. Почему
arg
нужно бросить на
double
написанокак тут
1 ответ
Он говорит: «эквивалентно поведению, если оно приведено к». Что может означать, «поскольку буквально каждое значение данного типа может давать действительный (возможно, неточный)
double
значение, реализация - это просто время компиляции
return false;
". Во многих C++ есть "вот как это ведет себя логически", а затем полагается на правило "как если бы", чтобы сказать: "но вы можете сделать что-то еще, что логически эквивалентно, если, помимо производительности, поведение такое же, когда делается какое-то другое путь."
По-прежнему полезно иметь его, когда у вас есть шаблонный класс/функция, реализованный для нескольких числовых типов, но шаблонный тип может иметь или не иметь концепцию NaN. Вы можете безоговорочно фильтровать (или иным образом обрабатывать) NaN, и, по крайней мере, с включенной оптимизацией, почти гарантировано, что путь для
isnan(someinteger)
будет скомпилирован, но когда шаблон реализован для типов с плавающей запятой, он фактически выполнит тест и ветвление.