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 模板非类型参数,但似乎没有在那里指定,但我真的很难阅读标准,所以我可能会遗漏一些明显的东西。