调用 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)...);
}
我了解可变参数模板并将其解包。
但是,我不明白 ...
的语法是“after ” std::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));
函数 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)...);
}
我了解可变参数模板并将其解包。
但是,我不明白 ...
的语法是“after ” std::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));