浮点型作为非类型模板参数的特化匹配规则是什么?
你的猜测基本正确,浮点型非类型模板参数的特化匹配确实采用和普通==运算不同的判定规则,本质上等价于按位比较。
标准规则说明
C20首次支持将浮点类型作为非类型模板参数,对应的等价性判定规则在C标准的「模板类型等价」章节中明确规定:
两个非类型模板参数值
a和b是等价的,当且仅当对于对应类型T,a和b拥有相同的值,此处的「相同值」判定遵循T类型对应的数学相等定义,而非重载operator==的运行时行为。
对于遵循IEEE 754标准的浮点类型(主流平台的主流编译器均遵循该规范),这里的「相同值」对应IEEE 754定义的等同判定逻辑,和普通==运算的规则完全不同:
- 普通
==运算遵循IEEE 754的无序比较规则:任何NaN和任意值(包括自身)比较都会返回false - 等同判定逻辑要求两个值的位模式完全一致:只要两个NaN的符号位、指数位、尾数位完全匹配,就会被判定为等价,和
==的运算结果无关。
如果实现的浮点类型不遵循IEEE 754,具体判定规则由实现定义,但主流场景下均采用上述按位比较的逻辑。
代码行为解释
对应你给出的测试代码,行为完全符合上述规则:
static_assert中使用==比较两个相同位模式的信令NaN,符合IEEE 754规则返回false,断言通过- 模板特化匹配时采用等同判定,特化声明和调用时传入的信令NaN位模式完全一致,因此成功匹配特化,输出
sn - 调用时传入的静默NaN和特化的信令NaN位模式不同,无法匹配特化,因此调用主模板输出
val: nan
内容的提问来源于stack exchange,提问作者NoSenseEtAl
相关产品推荐
相关产品推荐

