首页 >后端开发 >C++ >C 11 SFINAE 中的'直接上下文”是什么以及它如何影响替换失败?

C 11 SFINAE 中的'直接上下文”是什么以及它如何影响替换失败?

Barbara Streisand
Barbara Streisand原创
2024-12-12 19:10:11968浏览

What is the

理解 C 11 SFINAE 中的“直接上下文”

C 11 标准指定了替换失败导致硬编译的条件错误或软错误,只是从重载解析候选中丢弃模板。这一决定中的一个关键概念是“直接上下文”。

“直接上下文”的定义

标准中简要提到了术语“直接上下文”,但其具体定义并未明确提供。然而,它经常与以下文本一起出现:

Note: The evaluation of the substituted types and expressions can result in side effects such as instantiation of template specializations, generation of implicitly-defined functions, etc. Such side effects are not in the “immediate context” and can result in the program being ill-formed.

此注释表明在替换过程中发生的任何副作用,例如模板实例化或隐式函数定义,不被视为替换过程的一部分直接上下文。

确定直接上下文中的替换错误

至确定是否在直接上下文中发生替换错误,请考虑以下步骤:

  1. 识别副作用:想象一下实例化所有模板并定义模板参数替换所需的所有隐式函数.
  2. 检查错误:如果在此“准备”阶段出现任何错误,它们不属于立即处理的一部分上下文并导致硬编译错误。
  3. 替换参数:一旦生成了所有必要的实例化和定义且没有错误,请将参数替换为函数模板的签名。
  4. 在替换过程中检查错误:如果在最后的替换步骤中出现任何错误,它们不是真正的错误,而是演绎错误

示例

考虑以下模板和后备函数:

template<typename T>
void func(typename T::type* arg);

template<>
void func(...);
  1. 案例1:假设 A 是一个带有类型成员的模板,调用func::type*>(nullptr) 将失败并出现硬编译错误,因为实例化 A (在准备期间)创建一个指向引用的无效指针。
  2. 情况 2:如果 A 对 char 有显式特化,则调用 func::type*> ;(nullptr) 将实例化 A; (准备成功),但随后的 A::type 替换(最后一步)失败,因为它不存在。这会导致推演失败,并使用后备函数。

结论

通过理解直接上下文的概念,您可以更好地识别何时替换错误将导致硬编译错误或软推导失败,从而可以在 C 11 中有效使用 SFINAE。

以上是C 11 SFINAE 中的'直接上下文”是什么以及它如何影响替换失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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