1. 程式人生 > 實用技巧 >c++11 std::forward使用場景以及作用

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轉發問題針對的是模板函式。