编译器中非类型模板参数的 static_assert 行为不一致
在 C 中, static_assert 可用于在编译时验证条件。然而,最近的观察发现,当 static_assert 与不同编译器中的非类型模板参数结合使用时,其行为存在差异。
具体来说,以下代码片段:
template
struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template
struct Hitchhiker {};
尝试使用 static_assert 禁用通用模板实例化时,在 Clang 和 GCC 上的行为有所不同。即使模板未实例化,Clang 也会触发断言错误,而 GCC 仅在使用 42 以外的参数值实例化时才会引发错误。
要了解差异,让我们探索 C 标准的相关部分( [temp.res]/8):
If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
根据此规则,主模板 Hitchhiker 格式错误,因为无法生成有效的专业化。因此,不需要发出诊断。然而,尽管缺乏要求,Clang 还是选择提供诊断。
如果意图将实例化限制为仅 42 个,建议的方法是省略通用模板定义,如下所示:
template
struct Hitchhiker {};
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3