为何enable_if的模板参数T默认值为void?兼析模板匹配逻辑
template<bool B, class T = void> struct enable_if {}; // #1 template<class T> struct enable_if<true, T> { typedef T type; }; // #2
第一个问题:为什么B为true时T会被推导为void?
主模板(#1)里声明的模板参数默认值是全局有效的,所有针对这个模板的特化都会继承这个默认值,除非特化自己显式重新定义。#2作为部分特化,只指定了第一个模板参数固定为true,没有重新声明T的默认值,所以当你只写enable_if<true>时,会自动使用主模板里T的默认值void,也就是等价于enable_if<true, void>,这时候就会匹配上#2的特化,最终T的类型就是void。
第二个问题:为什么B为false时会匹配#1?
#2是针对B=true的部分特化,只有当模板的第一个参数是true时,编译器才会优先选择这个特化版本。当B为false时,没有任何特化版本能匹配这个参数组合,所以编译器会 fallback 到主模板#1——这是C++模板匹配的规则:优先匹配最贴合的特化,没有合适特化时就用主模板。
内容的提问来源于stack exchange,提问作者just_code_dog
相关产品推荐
相关产品推荐

