【问题标题】:Forwarding arguments with auto in C++20? [duplicate]在 C++20 中使用 auto 转发参数? [复制]
【发布时间】:2021-01-28 07:27:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我觉得这里已经回答了stackoverflow.com/questions/24535430/…
  • @StoryTeller-UnslanderMonica 我认为这种可变性使其完全不同。正确的语法可以说是不明显的。
  • @cigien - 这是细枝末节......而且可能会抓住稻草。与单个参数相比,包引起的语法差异是几个额外的省略号。
  • 是的,无论哪种方式我都可以,因为它是重复的。我怀疑decltype 是正确的答案,但我不清楚它是否正确处理了所有引用折叠/转发引用的内容。
  • @StoryTeller-UnslanderMonica 当然,但语法上的差异并不是很多未来访问者会关心的。并且拼写可以合理地为&lt;decltype(args...)&gt;。编译器只说“在这里解析错误”。我对那个 pov 的骗局持怀疑态度。

标签: c++ c++20


【解决方案1】:

您可以在decltype 的帮助下完成。

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

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

【讨论】:

  • FWIW,这与自 C++14 以来我们可以在可变参数泛型 lambda 中使用的语法完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2021-05-16
相关资源
最近更新 更多