在模板专业化方面,如何将浮点数视为非类型模板参数

NoS*_*tAl 5 c++ ieee-754 c++20 non-type-template-parameter

考虑以下程序

#include <iostream>
#include <limits>

template<float f>
void fun(){
    std::cout << "val: " << f << "\n";
}

template<>
void fun<std::numeric_limits<float>::signaling_NaN()>(){
    std::cout << "sn\n";
}

int main() {
    static_assert(std::numeric_limits<float>::signaling_NaN()!=std::numeric_limits<float>::signaling_NaN());
    fun<std::numeric_limits<float>::signaling_NaN()>();
    fun<std::numeric_limits<float>::quiet_NaN()>();
}
Run Code Online (Sandbox Code Playgroud)

它打印出:

Sn
值:nan

因此,这让我认为编译器在考虑模板专门化时会对浮点数进行按位比较(请参阅参考资料static_assert)。它是否正确?

我尝试阅读 13.4.3 模板非类型参数,但似乎没有在那里指定,但我真的很难阅读标准,所以我可能会遗漏一些明显的东西。