• 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转发问题针对的是模板函数。

  • 相关阅读:
    OpenCV 图像二值化 threshold
    C++ pow()函数
    Marr-Hildreth 边缘检测 OpenCV C++实现
    OpenCV 边缘检测 Canny
    OpenCV Canny()函数
    OpenCV Sobel()函数
    OpenCV 边缘检测 Sobel
    OpenCV 边缘检测 Laplacian
    OpenCV 边缘检测 Scharr
    OpenCV 形态学变换 morphologyEx函数
  • 原文地址:https://www.cnblogs.com/rayfloyd/p/14309276.html
Copyright © 2020-2023  润新知