[問題] std::forward疑問

看板C_and_CPP (C/C++)作者 (王大明)時間2年前 (2021/06/13 18:26), 編輯推噓0(007)
留言7則, 2人參與, 2年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 最近看到一個範例,想不懂為何這個x是個lvalue被forward兩次之後變成 rvalue ??我的理解x本來是lvalue,forward應該都還是lvalue阿!! #include <iostream> void PrintT(int& t) { std::cout << "lvalue" << std::endl; } template <typename T> void PrintT(T&& t) { std::cout << "rvalue" << std::endl; } template <typename T> void TestForward(T&& v) { PrintT(std::forward<T>(v)); } void Test() { int x = 1; TestForward(std::forward<int>(x)); } Output: rvalue -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.9.34.163 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1623579964.A.2DF.html

06/13 19:03, 2年前 , 1F
第一個錯誤是:應該寫成
06/13 19:03, 1F

06/13 19:03, 2年前 , 2F
TestForward(std::forward<int&>(x))
06/13 19:03, 2F

06/13 19:04, 2年前 , 3F
因為 Test 裡面在傳引數的時候就用 forward<int>(x)
06/13 19:04, 3F

06/13 19:06, 2年前 , 4F
可想下 TestForward 的引數是右值時,T 會被推導成甚麼
06/13 19:06, 4F

06/13 19:08, 2年前 , 5F
第二個是 void PrintT(T&& t) 其實不代表是rvalue,
06/13 19:08, 5F

06/13 19:09, 2年前 , 6F
而是接受任何一種變數 (當然如果是int&的話
06/13 19:09, 6F

06/13 19:09, 2年前 , 7F
一般function優先) , 可以搜尋universal reference了解
06/13 19:09, 7F
文章代碼(AID): #1WnTqyBV (C_and_CPP)
文章代碼(AID): #1WnTqyBV (C_and_CPP)