C++11 引入 auto 和 decltype 之后,"类型"不再总是需要用手写。但这套推导规则有三个不同机制——auto、decltype(auto)、decltype(expression)——它们各自按不同的逻辑工作。更微妙的是,当 auto&& 遇到万能引用,或者 decltype 遇到括号,行为会发生令人意外的翻转。
本文从模板实参推导的规则出发,把这三条推导路径的差异,以及日常使用中最容易踩的坑,逐一说清楚。
2026/5/6大约 5 分钟
C++11 引入 auto 和 decltype 之后,"类型"不再总是需要用手写。但这套推导规则有三个不同机制——auto、decltype(auto)、decltype(expression)——它们各自按不同的逻辑工作。更微妙的是,当 auto&& 遇到万能引用,或者 decltype 遇到括号,行为会发生令人意外的翻转。
本文从模板实参推导的规则出发,把这三条推导路径的差异,以及日常使用中最容易踩的坑,逐一说清楚。