作者WangDaMing (王大明)
看板C_and_CPP
标题[问题] std::forward疑问
时间Sun Jun 13 18:26:02 2021
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1623579964.A.2DF.html
1F:→ g0010726: 第一个错误是:应该写成 06/13 19:03
2F:→ g0010726: TestForward(std::forward<int&>(x)) 06/13 19:03
3F:→ a27417332: 因为 Test 里面在传引数的时候就用 forward<int>(x) 06/13 19:04
4F:→ a27417332: 可想下 TestForward 的引数是右值时,T 会被推导成甚麽 06/13 19:06
5F:→ g0010726: 第二个是 void PrintT(T&& t) 其实不代表是rvalue, 06/13 19:08
6F:→ g0010726: 而是接受任何一种变数 (当然如果是int&的话 06/13 19:09
7F:→ g0010726: 一般function优先) , 可以搜寻universal reference了解 06/13 19:09
8F:推 lovejomi: 一开始就不该用forward 你的用法 效果上会变成 std::mov 06/16 03:37
9F:→ lovejomi: e(x) 转型成rvalue了 才会走到universal reference的Pri 06/16 03:37
10F:→ lovejomi: ntT 06/16 03:37