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中文网其他相关文章!