为什么在 C++ 中对浮点类型和整数类型的处理方式不同

Why are floating point types and integer types are treated differently in C++

最近我发现在 C++ 中浮点类型和整数类型的处理方式截然不同。

示例 1 来自:Why are floating point types invalid template parameter types for template functions?

template <double x>
double func() {
  return x;
}

无效,而int有效。

示例 2 来自:How to initialize private static members in C++?

class foo
{
    private:
        static float const i = 42;
};

无效,而int有效。


在第一个链接的问题中有一个 Versuch 的答案。它声明 像 float 和 double 这样的类型在 C++ 中没有定义的实现。但是,对于 C++ 中的许多其他地方,尤其是整数类型(1 补码与 2 补码)也可以这样说。

因此,浮点数和整数的区别对待是否有更深层次的原因?

潜在的问题是 12 总是有不同的值,不管这些值是如何表示的。 3.1111111111153.111111111114 在不同的系统上可能有也可能没有不同的值,这取决于值的表示方式,并且在同一系统上可能有不同的运行时值,这取决于舍入模式的设置方式。前者是编写可移植代码的根本问题:在一个系统上,x<3.111111111115>x<3.111111111114> 可能是两种不同的类型,而在另一个系统上可能是同一类型。后者对类型系统来说不是问题,但会给用户设置陷阱,因为对这些值的相等性测试可能会从模板实例化的类型比较中产生不同的结果。

这种不确定性的一个实际后果是

void f(x<3.111111111115>) {} 
void f(x<3.111111111114>) {}

在一个平台上可能是合法的,但在另一个平台上是非法的。