C++20缩写函数模板使用限制及未来支持规划相关问询
编译错误的根本原因
- C++20 引入的缩写函数模板规则仅支持直接将
auto作为函数参数的类型说明符,这种场景下编译器会自动生成对应的模板声明:比如void abbreviated_test1(auto x)会被等价转换为template<typename T> void test1(T x)。 - 你尝试的
matrix<auto>写法中,auto是作为模板类matrix的模板实参存在,属于嵌套在类型内部的使用场景,C20及更早的C标准既没有定义这种场景下的模板参数推导规则,也不允许auto出现在模板实参的位置,因此编译器会直接报错。
后续标准的支持计划
- 针对这类更复杂的缩写函数模板需求,C++标准委员会已经有对应的提案,明确要扩展
auto的合法使用范围,支持在模板实参位置使用auto来缩写模板函数声明,void abbreviated_test2(matrix<auto> x)这种写法最终会被标准认可。 - 目前GCC 12+、Clang 16+等主流编译器的高版本,在开启C23(或实验性C2b)编译选项时,已经可以正常编译这类写法。
内容的提问来源于stack exchange,提问作者yorel
相关产品推荐
相关产品推荐

