带有非类型模板参数的静态断言
在 C 中, static_assert 用于在编译时检查条件。然而,不同的编译器在使用带有非类型模板参数的 static_assert 时表现出不同的行为。
问题:
以下代码片段:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
使用 GCC 和 Clang 编译时会产生不同的结果。在GCC中,只有在实例化Hitchhiker时参数不是42时才会产生断言错误。在Clang中,即使没有实例化模板也会产生断言错误。
修改断言如下:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
导致两个编译器之间的行为一致,仅在模板期间检查断言
答案:
根据 C 标准 ([temp.res]/8),没有有效专业化的未实例化模板被认为是格式错误的,无需
结论:
在原始代码的情况下,GCC 选择不对未实例化的模板发出诊断。另一方面,Clang 决定发出诊断信息,尽管标准并不要求这样做。修改后的代码的行为在编译器之间更加一致,因为仅在实际实例化模板时才检查断言。
需要注意的是,在这种情况下诊断的存在或不存在并不表示错误在代码中。未实例化的模板本质上是格式错误的,任何尝试使用无效的专业化来实例化它都会导致编译错误。
以上是为什么带有非类型模板参数的“static_assert”在 GCC 和 Clang 中表现不同?的详细内容。更多信息请关注PHP中文网其他相关文章!