C++ utility forward 函数

  • 定义和用法

    lvalue (1) 
    template <class T> T&& forward (typename remove_reference<T>::type& arg) noexcept;
    rvalue (2)      
    template <class T> T&& forward (typename remove_reference<T>::type&& arg) noexcept;
    std::forward 如果arg不是左值引用,则返回对arg的右值引用。如果arg是左值引用,则该函数将返回arg而不修改其类型。这是一个辅助函数,可以将作为右值引用的参数完美地转发到推导类型,同时保留任何可能涉及的移动语义。该函数的需求源于以下事实:所有命名值(例如函数参数)始终以左值(甚至是声明为右值引用的左值)求值,这在保留将参数转发给其他函数的模板函数上的潜在移动语义方面造成了困难。 。这两个签名的返回结果相同:
    
    static_cast<decltype(arg)&&>(arg)
    
    通过提供两个签名并在T上使用remove_reference,任何实例都被强制显式指定T的类型(任何隐式推导的T将不匹配)。
  • 参数

    arg
    一个对象。
  • 返回值

    如果arg是左值引用,则该函数将返回类型不变的arg。否则,函数将返回一个右值引用(T &&),该引用引用可用于传递右值的arg。
  • 示例

    
    // forward example
    #include <utility>      // std::forward
    #include <iostream>     // std::cout
    
    // function with lvalue and rvalue reference overloads:
    void overloaded (const int& x) {std::cout << "[lvalue]";}
    void overloaded (int&& x) {std::cout << "[rvalue]";}
    
    // function template taking rvalue reference to deduced type:
    template <class T> void fn (T&& x) {
      overloaded (x);                   // always an lvalue
      overloaded (std::forward<T>(x));  // rvalue if argument is rvalue
    }
    
    int main () {
      int a;
    
      std::cout << "calling fn with lvalue: ";
      fn (a);
      std::cout << '\n';
    
      std::cout << "calling fn with rvalue: ";
      fn (0);
      std::cout << '\n';
    
      return 0;
    }
    
    尝试一下
    输出
    
    calling fn with lvalue: [lvalue][lvalue]
    calling fn with rvalue: [lvalue][rvalue]
    
  • 数据竞争

    无。
  • 异常安全

    这函数不会抛出异常。
  • 相关页面

    move 作为右值移动(function template)