首页 >后端开发 >C++ >是什么决定了 C 11 模板替换错误是硬错误还是软错误?

是什么决定了 C 11 模板替换错误是硬错误还是软错误?

Patricia Arquette
Patricia Arquette原创
2024-12-18 19:03:11351浏览

What Determines Whether a C  11 Template Substitution Error Is a Hard or Soft Error?

C 11 模板替换中的直接上下文

C 11 标准引入了替换失败不是错误 (SFINAE),它允许在模板参数替换期间抑制硬编译错误。然而,该标准定义了 SFINAE 适用的特定“直接上下文”,从而导致替换错误何时导致硬错误或软错误存在一些不确定性。

立即上下文定义

标准将直接上下文定义为:

“只有函数类型及其直接上下文中的无效类型和表达式模板参数类型可能会导致推导失败。”

这个定义很模糊,但非规范注释提供了提示:

“对替换类型和表达式的求值可能会导致副作用,例如......此类副作用不在“直接上下文”中,并且可能导致程序格式错误。”

决定过程

要确定在直接上下文中是否发生替换错误,请考虑以下决策过程:

  • 第 1 步: 识别所有模板和确定替换结果所需的隐式定义函数。
  • 第 2 步: 想象一下这些实体是在替换开始之前生成的。
  • 第 3 步: 如果在此假设生成期间发生错误,它们不会出现在直接上下文中,并将导致硬错误。
  • 第 4 步: 如果生成的所有实体都没有错误,则替换期间的任何后续错误都不是错误,而是导致参数推导

示例

结论

通过理解直接上下文的概念并使用通过上述决策过程,程序员可以更好地预测替换错误何时会导致硬错误或软错误,从而能够在 C 11 中更有效地使用 SFINAE模板。

以上是是什么决定了 C 11 模板替换错误是硬错误还是软错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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