调用 std::forward 后的 '...' 的语法是什么意思?

What does the syntax of '...' after the call to std::forward mean?

函数 std::forward 声明如下:

template< class T >
T&& forward( typename std::remove_reference<T>::type& t ) noexcept;

意味着它接受一个 std::remove_reference<T>::type&.

类型的参数

但是,std::forward 也可以与可变参数一起使用:

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

我了解可变参数模板并将其解包。

但是,我不明白 ... 的语法是“afterstd::forward.

的调用

这个语法的确切含义是什么?为什么它有效?它可以与 std::forward 以外的函数一起使用吗?

这就是所谓的pack expansion。它用参数包的每个成员之间的逗号扩展参数包,所以

q(std::forward<Args>(args)...);

表示对参数包的每个成员 args 应用 std::forward。生成的代码看起来像

q(std::forward<Args>(args1), std::forward<Args>(args2), ..., std::forward<Args>(argsN));

这适用于任何表达式,它不仅仅适用于 std::forward。例如,您可以为每个参数添加一些值,例如

q((args + 1)...);

然后会扩展到

q((args1 + 1), (args2 + 1), ..., (argsN + 1));