You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:47:34