ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – SFINAE是否依赖于类型扣除?

2019-07-24 10:05:08  阅读:211  来源: 互联网

标签:type-deduction template-deduction c sfinae


我对cppreference.com中的以下引用感到困惑:

This rule applies during overload resolution of function templates: When substituting the deduced type for the template parameter fails, the specialization is discarded from the overload set instead of causing a compile error.

这是否意味着SFINAE无法在没有类型扣除的情况下工作?例如,请考虑以下代码:

template <typename T> std::true_type has_value_type_helper(typename T::value_type*);
template <typename> std::false_type has_value_type_helper(...);

template <typename T> inline constexpr bool has_value_type_v
   = decltype(has_value_type_helper<T>(nullptr))::value;

int main() {
   std::cout << has_value_type_v<int> << std::endl;
   std::cout << has_value_type_v<std::vector<int>> << std::endl;
}

它按预期工作,但据我所知,没有类型扣除.模板参数在has_value_type_helper< T>(nullptr)中明确提供.甚至SFINAE可以用这种方式吗?

解决方法:

Can even SFINAE be used this way?

是.

替换是扣除过程的一部分.明确提供模板参数并不能消除替换的需要([temp.deduct]/2) – 而且它是替换(SFINAE中的S)失败并非错误([temp.deduct]/8).

在这种情况下,当您向has_value_type_helper显式提供T时,我们仍然需要将T替换为参数T :: value_type.这是在替换的直接上下文中,因此如果该替换失败 – 对于类似int的类型而言,它没有名为value_type的嵌套类型别名 – 它是……而不是错误,我们只是从考虑中移除候选者.我们有另一个备用候选者,所以这很好.

标签:type-deduction,template-deduction,c,sfinae
来源: https://codeday.me/bug/20190724/1521147.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有