首页 > 后端开发 > C++ > C 11 SFINAE 中'直接上下文”的定义是什么?

C 11 SFINAE 中'直接上下文”的定义是什么?

DDD
发布: 2024-12-12 20:17:11
原创
174 人浏览过

What Defines

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::type不存在,但此错误发生在准备阶段之后,只会导致参数推导失败并使用fallback函数。

以上是C 11 SFINAE 中'直接上下文”的定义是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板