使用 std::forward 进行参数包扩展的“...”语法

Dra*_*son 3 c++ templates variadic-functions variadic-templates perfect-forwarding

在C++中,似乎参数通常可以...直接在参数包名称之后扩展。例如,

template <class... Tys>
void function(Tys... params) {
    function(params...);
}
Run Code Online (Sandbox Code Playgroud)

然而,当使用 时std::forward...看起来似乎在参数包名称后面。例如,

template <class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params)...); // The '...' is outside the parenthesis of 'params'
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么会有差异?为什么下面的代码不正确?

template<class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params...));
}
Run Code Online (Sandbox Code Playgroud)

参数包在什么时候展开?我可能不完全理解它是如何std::forward工作的或者它如何完美地转发论点。

我很感激任何答案!

Rem*_*eau 6

适用...于其左侧的事物。

  • function(params...)

    扩展到

    function(param1, param2, ..., paramN)

  • function(std::forward<Tys>(params)...)

    扩展到

    function(std::forward<Tys1>(param1), std::forward<Tys2>(param2), ..., std::forward<TysN>(paramN))

  • function(std::forward<Tys>(params...))

    扩展到

    function(std::forward<Tys>(param1, param2, ..., paramN))