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