整型的 std::isnan 和 std::isinf 的重载

Overloads of std::isnan and std::isinf for integral types

本文关键字:std isinf 重载 isnan 整型      更新时间:2023-10-16

Cpp首选项提到了整型std::isnanstd::isinf(也许还有其他(的重载。这使得以下调用明确:

std::isnan(1);

但是,我在C++标准中找不到任何此类重载。我检查了 C++11 和当前草稿,只有 floatdoublelong double 的重载。

至于编译器行为,GCC 和 Clang 都编译代码,但 MSVC 不编译。谁是对的?cpp首选项的整体重载从何而来?

cmath 标准页面末尾有一段:

对于<cmath>内的每一组重载函数,除了abs,应该有额外的重载足以确保:

2. 否则,如果任何对应于双精度参数的算术类型的参数具有双精度

或整数类型,则所有对应于双精度参数的算术类型的参数都将有效地转换为双精度。

积分重载

是必需的,否则会在三个浮点重载之间收到不明确的调用,但未指定如何实现此类重载。


请注意,<cmath> 标头中的其他函数对整型类型具有正确的重载,例如,

std::atan(1)

调用模板化版本 double atan<int,void>(int)

这是一个概要,有一个脚注

对于 中的每组重载函数,除了 abs 之外,应该有额外的重载足以确保:

    否则,如果对应于双精度参数的任何算术类型的参数具有双精度
  1. 或整数类型,则对应于双精度参数的所有算术类型的参数都将有效地转换为双精度。

对应于bool isnan( IntegralType arg )描述

一组重载或接受任何整型 arg 参数的函数模板。等效于 (2((参数转换为双精度(。