理解 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.
此注释表明在替换过程中发生的任何副作用,例如模板实例化或隐式函数定义,不被视为替换过程的一部分直接上下文。
确定直接上下文中的替换错误
至确定是否在直接上下文中发生替换错误,请考虑以下步骤:
示例
考虑以下模板和后备函数:
template<typename T> void func(typename T::type* arg); template<> void func(...);
结论
通过理解直接上下文的概念,您可以更好地识别何时替换错误将导致硬编译错误或软推导失败,从而可以在 C 11 中有效使用 SFINAE。
以上是C 11 SFINAE 中的'直接上下文”是什么以及它如何影响替换失败?的详细内容。更多信息请关注PHP中文网其他相关文章!