C++ 在C+中使用auto转发参数+;20?

C++ 在C+中使用auto转发参数+;20?,c++,c++20,C++,C++20,在C++20中,以下函数的格式是否正确: void f(auto&&... args) { /*...*/ } 而且,如果不是格式错误,是否有一种方法可以以与以下函数完全相同的方式在正文中转发参数(而不修改签名): template<typename... Args> void f(Args&&... args) { g(std::forward<Args>(args)...); } 模板 无效f(参数&&…参数){ g(标准:

在C++20中,以下函数的格式是否正确:

void f(auto&&... args) { /*...*/ }
而且,如果不是格式错误,是否有一种方法可以以与以下函数完全相同的方式在正文中转发参数(而不修改签名):

template<typename... Args>
void f(Args&&... args) {
    g(std::forward<Args>(args)...);
}
模板
无效f(参数&&…参数){
g(标准:正向(参数)…);
}

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

您可以在
decltype
的帮助下执行此操作

void f(auto&&... args) {
    g(std::forward<decltype(args)>(args)...);
}
void f(自动&&…参数){
g(标准:正向(参数)…);
}

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

我觉得这里已经回答了@StoryTeller UnslanderMonica这是可变的,我认为这是非常不同的。正确的语法可以说是不明显的。@cigien-这是细节。。。还有可能抓救命稻草。与单个参数相比,一个包引起的语法差异是多了几个省略号。是的,无论哪种方式,我都同意它是重复的。我怀疑
decltype
是正确的答案,但我不清楚它是否正确处理了所有引用折叠/转发引用内容。@StoryTeller UnslanderMonica当然,但语法上的差异并不是很多未来访问者所关心的。拼写可以合理地为
。编译器只会说“此处解析错误”。我对pov.FWIW中的dupe持怀疑态度,这与我们从C++14开始在变量泛型lambda中使用的语法完全相同。