首页 > 后端开发 > C++ > C 函数重载中的返回类型和模板参数之间的 SFINAE 行为有何不同?

C 函数重载中的返回类型和模板参数之间的 SFINAE 行为有何不同?

Linda Hamilton
发布: 2024-12-27 04:43:51
原创
630 人浏览过

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

SFINAE 返回类型与模板参数的行为差异

在 C 中,替换失败不是错误 (SFINAE) 习惯用法允许有条件基于模板元编程和类型特征的函数重载。但是,在某些情况下,SFINAE 的行为会有所不同,具体取决于其在函数模板声明中的位置。

考虑以下代码:

template<typename T,
         typename = typename std::enable_if<
                        std::is_integral<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T,
         typename = typename std::enable_if<
                        std::is_floating_point<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_integral<T>::value>::type;

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_floating_point<T>::value>::type;
登录后复制

在第一组重载(不正确的位置)中,将 SFINAE 放在模板参数中而不是返回类型中会导致编译错误。这是因为在确定重载等效性时不考虑默认模板参数(在本例中为 ::type 后缀)。因此,编译器将函数视为具有相同签名的重复声明。

但是,在第二组重载(正确放置)中,SFINAE 应用于返回类型,这涉及模板元编程。这种放置确保引用模板参数的表达式是函数签名的一部分。因此,编译器将重载识别为不同的实体,从而使 SFINAE 能够正常运行。

以上是C 函数重载中的返回类型和模板参数之间的 SFINAE 行为有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

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