【问题标题】:C++ Forwarding on variadic values which are not rvalue references非右值引用的可变参数的 C++ 转发
【发布时间】:2021-10-29 22:31:18
【问题描述】:

考虑:

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

template <typename... Args>
void foo2(Args&&... args) {
    bar(std::forward<Args>(args)...);
}

我了解foo2 的完美右值引用转发,但是转发foo 的可变参数值的目的是什么?

如果foo 看起来像这样会有什么不同?

template <typename... Args>
void foo(Args... args) {
    bar(args...);
}

【问题讨论】:

    标签: c++ variadic-templates perfect-forwarding


    【解决方案1】:

    这不是一回事。

    在这

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

    这两件事加起来就是static_cast&lt;Args&amp;&amp;&gt;(args)...有一个右值引用返回类型,即返回一个右值(因为Args不是一个引用,所以Args&amp;&amp;之间不会发生引用折叠给一个左值引用返回类型,这意味着一个左值返回值)。

    所以不,在您的第一个版本 foo 中没有完美的转发。其中的std::forward 无条件地将其参数转换为右值;这通常是std::move 的工作:

    // this is equivalent to the code above
    template <typename... Args>
    void foo(Args... args) {
        bar(std::move(args)...);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多