尝试使用浮点值作为默认参数实例化泛型类模板时,编译器可能会问题错误。虽然整数值按预期运行,但浮点数却不然。
根据 C 11 标准 (14.3.2/1),非类型模板参数-type 模板参数必须遵守特定规则。一项限制是它们不能是浮点值。相反,它们必须是整型或枚举类型、模板参数类型的转换常量表达式或其他特定构造。
此限制可能源于浮点计算的不精确性。准确地表示浮点值并不总是可行的,这会导致潜在的不准确,从而导致意外的行为。考虑以下示例:
func<1/3.f>(); func<2/6.f>();
虽然打算调用同一函数两次,但由于潜在的舍入误差,1/3 和 2/6 的浮点表示形式不能保证相同。这可能会导致意外的函数调用。
如果目标是以某种方式将浮点值表示为模板参数,一种选择是利用 C 11 常量表达式 (constexpr) 。这些允许在编译时计算浮点值的分子和分母,然后可以将其作为单独的整数参数传递。
但是,定义一个阈值以确保浮点值接近每个值至关重要其他共享相同的分子/分母对。否则,限制浮点值作为非类型模板参数的基本原理仍然有效。
以上是为什么浮点值不能用作 C 模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!