Почему std::isnan(IntegralType arg) приводит arg к двойному?

Интегральный тип не может быть NaN, насколько я понимаю, поэтому std::isnanможет просто вернуться falseпри заданном интегральном типе. Почему argнужно бросить на double написанокак тут

1 ответ

Он говорит: «эквивалентно поведению, если оно приведено к». Что может означать, «поскольку буквально каждое значение данного типа может давать действительный (возможно, неточный) doubleзначение, реализация - это просто время компиляции return false;". Во многих C++ есть "вот как это ведет себя логически", а затем полагается на правило "как если бы", чтобы сказать: "но вы можете сделать что-то еще, что логически эквивалентно, если, помимо производительности, поведение такое же, когда делается какое-то другое путь."

По-прежнему полезно иметь его, когда у вас есть шаблонный класс/функция, реализованный для нескольких числовых типов, но шаблонный тип может иметь или не иметь концепцию NaN. Вы можете безоговорочно фильтровать (или иным образом обрабатывать) NaN, и, по крайней мере, с включенной оптимизацией, почти гарантировано, что путь для isnan(someinteger)будет скомпилирован, но когда шаблон реализован для типов с плавающей запятой, он фактически выполнит тест и ветвление.

Другие вопросы по тегам