最近我一直在尝试理解移动语义并提出了一个问题。std :: forward实现之间的区别
该问题已被讨论here。
我实现了第一个变种,并检查其是否返回L值或R值:
#include <iostream>
using namespace std;
template <typename T>
T&& my_forward(T&& x) {
return static_cast<T&&> (x);
}
int main() {
int a = 5;
&my_forward(a); // l-value
return 0;
}
所以,如果我通过L值,则返回L值(编译,因为我可以如果我这样做:
&my_forward(int(5)); // r-value with int&& type
我的代码不编译,因为my_forward返回的r值。在上面的问题中,他们说这个实现和标准的区别(分别是std :: remove_reference和两个不同的参数分别是&和& &)是我的实现始终返回l值,它会返回r值和l值。
所以我想知道,为什么我不能实现std :: forward像那样?在哪些具体情况下会显示标准版本之间的区别?另外,为什么我应该将T指定为模板并且不能让它使用参数类型来定义它自己?
你为什么试图采取的右值引用地址? – xinaiz
@BlackMoses检查r值。 – LogicStuff
@LogicStuff啊,好吧,以为这是误判'&'的用法:) – xinaiz