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

问题描述 投票:0回答:1

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

template <class... Tys>
void function(Tys... params) {
    function(params...);
}

但是,当使用std::forward时,...似乎在参数包名称的之后处。例如,

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

我的问题是为什么会有区别?为什么以下代码不正确?

template<class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params...));
}

参数包在什么时候扩展?我可能不太了解std::forward的工作方式或它如何完美地转发参数。

我感谢您的回答!

c++ templates variadic-templates variadic-functions perfect-forwarding
1个回答
2
投票

...适用于它左边的东西。

  • 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))

© www.soinside.com 2019 - 2024. All rights reserved.