[问题] 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