【问题标题】:Syntax of '...' with Parameter Pack Expansion using std::forward使用 std::forward 进行参数包扩展的“...”的语法
【发布时间】:2020-04-08 02:44:27
【问题描述】:

在 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】:

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

  • function(params...)

    扩展到

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

  • function(std::forward&lt;Tys&gt;(params)...)

    扩展到

    function(std::forward&lt;Tys1&gt;(param1), std::forward&lt;Tys2&gt;(param2), ..., std::forward&lt;TysN&gt;(paramN))

  • function(std::forward&lt;Tys&gt;(params...))

    扩展到

    function(std::forward&lt;Tys&gt;(param1, param2, ..., paramN))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2011-11-07
    • 2015-05-03
    • 2017-10-23
    • 2021-08-08
    • 2019-11-26
    相关资源
    最近更新 更多