模板实例化中 static_assert 行为的评估
在此代码中,使用 static_assert 来验证非类型模板参数的值回答。但是,此断言的行为在 gcc 和 clang 之间有所不同:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
gcc 的行为:
gcc 仅在使用除以下参数之外的参数实例化 Hitchhiker 时触发断言: 42.
clang 的行为:
即使模板未显式实例化,clang 也会引发断言错误。
标准解释:
C 标准规定,如果模板没有有效的专业化并且未实例化,则该模板被视为格式错误。这意味着不需要诊断。
分析:
两个编译器的行为都是正确的。尽管标准不需要,Clang 选择提供诊断。
替代方法:
要只允许 42 的答案,可以省略通用模板,以及定义如下的专用模板:
<code class="cpp">template <> struct Hitchhiker<42> {};</code>
以上是GCC 和 Clang 之间的模板实例化中的'static_assert”行为是否有所不同?的详细内容。更多信息请关注PHP中文网其他相关文章!