[問題] std::forward疑問

作者: WangDaMing (王大明)   2021-06-13 18:26:02
開發平台(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
作者: g0010726 (Kevin)   2021-06-13 19:03:00
第一個錯誤是:應該寫成TestForward(std::forward<int&>(x))
作者: a27417332 (等號卡比)   2021-06-13 19:04:00
因為 Test 裡面在傳引數的時候就用 forward<int>(x)可想下 TestForward 的引數是右值時,T 會被推導成甚麼
作者: g0010726 (Kevin)   2021-06-13 19:08:00
第二個是 void PrintT(T&& t) 其實不代表是rvalue,而是接受任何一種變數 (當然如果是int&的話一般function優先) , 可以搜尋universal reference了解
作者: lovejomi (JOMI)   2021-06-16 03:37:00
一開始就不該用forward 你的用法 效果上會變成 std::move(x) 轉型成rvalue了 才會走到universal reference的PrintT

Links booklink

Contact Us: admin [ a t ] ucptt.com