При компиляции с помощью MSVC (v19.33) это не компилируется (неоднозначный вызов перегруженной функции C2668):
std::cout << std::isinf(0) << std::endl;
Но это компилируется:
std::cout << std::isinf(0.0) << std::endl;
Однако на cppreference.com написано:
- Набор перегрузок или шаблон функции, принимающий аргумент arg любого целочисленного типа. Эквивалентно (2) (аргумент преобразуется в double).
Похоже, эта функция существует в стандарте с C++11.
Если я правильно понял, первый код должен быть эквивалентен второму, не так ли? Означает ли это, что MSVC еще не реализовал перегруженные функции, или я что-то упустил?
(Напротив, если я использую gcc или clang, приведенные выше примеры компилируются без проблем).
@wohlstad Только что нашел эти результаты во время отладки, и я хотел знать, правильно ли я понимаю :) Коды примеров - это просто примеры, а не части моего проекта.
В реализации Microsoft определение isinf
выглядит следующим образом (скопировано из здесь):
template <class _Ty>
_Check_return_ inline bool isinf(_In_ _Ty _X) throw()
{
return fpclassify(_X) == FP_INFINITE;
}
Проблема с Microsoft fpclassify
заключается в отсутствии перегрузки для целочисленных типов. Подробнее см.:
'fpclassify': неоднозначный вызов перегруженной функции.
Я согласен с мнением, что MSVC здесь неправ (впрочем, похоже, им все равно).
Есть ли причина, по которой они это не реализуют? (например, какая-то сложная проблема обратной совместимости и т. д.) Спасибо за ответ!
@starriet Понятия не имею. Вам нужно будет спросить разработчиков Microsoft о причине.
Читая спецификацию, кажется, что вы правы в том, что MSVC ошибся. Но в любом случае - почему вы хотите проверить, является ли целочисленное значение бесконечным (никогда не будет истинным)?