• c++11 std::forward使用场景以及作用


    • 不使用 std::forward时,下述代码G不管传入什么类型的参数,只会最终调用 void F(int& a);
    using namespace std;
    
    void F(int& a) {
        cout << "int& version " <<a <<endl;
    }
    
    void F(int&& a) {
        // do something
        cout << "int&& version " <<a <<endl;
    }
    
    template<class A>
    void G(A &&a) {
        F(a); 
    }
    
    int main (int argc, char *argv[]) {
        int i = 2;
        G(i); //int& version
        G(5); //int& version
      return 0; 
    }
    • 用 std::forward时,G的最终调用出现差异化;
    using namespace std;
    
    void F(int& a) {
        cout << "int& version " <<a <<endl;
    }
    
    void F(int&& a) {
        // do something
        cout << "int&& version " <<a <<endl;
    }
    
    template<class A>
    void G(A &&a) {
        F(std::forward<A>(a));
    }
    
    int main (int argc, char *argv[]) {
        int i = 2;
        G(i); 
        G(5);
        return 0;
    }
    • 使用与不使用 std::forward的区别:

    函数模板 void G(A &&a)内部是无法知道形参对应的实参,到底是个普通变量,还是濒死的临时变量?

    只能原封不动的完美的转发std::forward给函数模板 void G(A &&a)调用的下一层函数。

    所以,std::forward转发问题针对的是模板函数。

  • 相关阅读:
    11 数据的增删改
    10 外键的变种 三种关系
    09 完整性约束
    03 body标签中的相关标签
    02 body标签中的相关标签
    01 HTML介绍和head标签
    08 数据类型(2)
    07 数据类型
    06 表的操作
    偶遇RecyclerView内部Bug
  • 原文地址:https://www.cnblogs.com/rayfloyd/p/14309276.html
Copyright © 2020-2023  润新知