首页 > 解决方案 > 在 C++20 中使用 auto 转发参数?

问题描述

在 C++20 中,以下函数是否格式错误:

void f(auto&&... args) { /*...*/ }

并且,如果不是格式错误,有没有办法以与以下函数完全相同的方式在正文中转发参数(不修改签名):

template<typename... Args>
void f(Args&&... args) {
    g(std::forward<Args>(args)...);
}

如果是这样,应该用什么代替Args作为模板参数的使用std::forward

标签: c++c++20

解决方案


您可以在 的帮助下做到这一点decltype

void f(auto&&... args) {
    g(std::forward<decltype(args)>(args)...);
}

当被传递左值时,decltype(args)产生 type T&std::forward会将它们作为左值转发。当被传递 rvalues 时,decltype(args)产生 type T&&std::forward会将它们作为 rvalues 转发。请注意,它与模板版本略有不同,其中T指定为std::forward;的模板参数。两种情况的效果(即作为右值转发)是相同的。


推荐阅读