C++20中void f(auto&&... args)是否合法及不改签名的完美转发方法
C++20 中 auto&&... 简写函数模板的合法性与转发实现
函数合法性判定
- 给出的
void f(auto&&... args)在C20标准中不属于非良构形式。该写法是C20引入的简写函数模板语法,编译器会自动将其展开为逻辑等价的变参函数模板,语法完全合规。
等效转发实现可行性
- 无需修改该函数的签名,完全可以在函数体内实现与目标显式模板函数完全一致的参数转发效果。
模板参数替换方案
- 原显式模板中
std::forward<Args>(args)...内的Args,需要替换为对每个形参逐个推导的decltype(args),最终函数实现如下:
void f(auto&&... args) { g(std::forward<decltype(args)>(args)...); }
- 等效性依据:
- C++20简写函数模板的类型推导规则与显式变参模板的推导规则完全对齐,每个
auto占位符的推导结果,与显式模板中逐个推导出的Args元素严格匹配 - 对参数包展开后的每一个形参取
decltype(args)(无需额外加括号),得到的类型就是简写模板自动展开时对应的逐元素模板参数,传入std::forward后,左值传递、右值移动的转发行为与显式模板版本完全一致,没有行为差异 - 注意:不能将写法改为
decltype((args)),该写法会按照表达式的值类别推导类型,所有形参都会被推导为左值引用类型,导致右值被错误按左值转发,失去完美转发能力
- C++20简写函数模板的类型推导规则与显式变参模板的推导规则完全对齐,每个
内容的提问来源于stack exchange,提问作者Andrew Tomazos
相关产品推荐
相关产品推荐

