首页 > 后端开发 > C++ > GCC 和 Clang 之间的模板实例化中的'static_assert”行为是否有所不同?

GCC 和 Clang 之间的模板实例化中的'static_assert”行为是否有所不同?

DDD
发布: 2024-11-05 01:10:01
原创
611 人浏览过

Does `static_assert` Behavior Vary in Template Instantiation Between GCC and Clang?

模板实例化中 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板