CTAD 与推导指引
更新时间:2026-10-01。让
std::pair p{1, "x"};这类写法成立,但规则需要理解。
一、隐式推导
编译器根据构造函数参数生成“推导指引”,把实参类型映射到模板参数,如 pair(T1,T2) 推出 pair<int,const char*>。
二、自定义指引
经典例子:vector(It, It) 默认会把 It 当成元素类型,标准库用 guide 强制推 vector<typename iterator_traits<It>::value_type>。你也可写 MyTemplate(T) -> MyTemplate<X>; 控制结果。

常见坑
- CTAD 不能“推一部分、指定一部分”。
- 花括号初始化列表常无法推导。
- 迭代器对构造推成错误类型(需 guide)。
小结
总结
CTAD(C++17 类模板参数推导)让构造类模板时可省略 <...>(如 pair p{1, 2.0}):编译器根据构造函数签名生成隐式推导指引把实参类型映射到模板参数,当隐式结果不对(典型如 vector(It, It) 会误把迭代器本身当元素类型)时用自定义 deduction guide(Sig -> Class<T>;)修正;坑在于不能"推一部分、显式指定一部分"、初始化花括号列表通常无法推导、复制推导与引用意外,所以推导不直观时宁可显式写出模板参数。