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

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

DDD
DDD原创
2024-11-05 01:10:01620浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn