C 11 SFINAE 中的直接上下文
C 11 标准将 SFINAE(替换失败不是错误)定义为一种有条件启用的技术或禁用基于模板参数推导的代码。第 14.8.2/8 节概述了替换失败导致“硬”编译错误或导致 SFINAE 的“软”错误的条件。
该标准在本节中引用了“直接上下文” ,表明只有函数类型及其模板参数类型的直接上下文中的无效类型和表达式才会导致推导失败。然而,“直接上下文”的定义并不明确。
立即上下文的决策过程
要确定直接上下文中是否发生替换错误,请考虑以下:
想象一下模板参数替换所需的所有模板和隐式定义的函数都是预先生成的。在此准备过程中发生的任何错误都不在直接上下文中,并将导致硬编译错误。
如果准备步骤成功完成,则替换期间的任何后续错误(例如,引用实例化模板或隐式定义的函数)函数模板签名中)不构成错误,但会导致推论
示例
示例 1:
template<typename T> void func(typename T::type* arg); template<typename> void func(...); template<typename T> struct A { typedef T* type; }; func<A<int&>>(...);
在此示例中,实例化A
示例 2:
template<typename T> void func(typename T::type* arg); template<typename> void func(...); template<typename T> struct A { typedef T* type; }; template<> struct A<char> {}; func<A<char>>(...);
在此示例中,准备步骤成功实例化A char 。在替换过程中,A
以上是C 11 SFINAE 中'直接上下文”的定义是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!