最近我一直在尝试理解移动语义并提出了一个问题。
这个问题已经在这里讨论过了。
我实现了第一个变体并检查它是否返回左值或右值:
#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-value,它会返回 l-value(编译,因为我可以从 l-value 获取地址),如果我这样做:
&my_forward(int(5)); // r-value with int&& type
我的代码无法编译,因为 my_forward 返回了 r 值。在上面的问题中,他们说这个实现和标准实现之间的区别(分别使用 std::remove_reference 和 2 个不同的参数与 & 和 && )是我的实现一直返回左值,但正如我所展示的那样返回右值和左值。
所以我想知道,为什么我不能像那样实现 std::forward ?在什么特定情况下,它会显示标准之间的差异?另外,为什么我应该将 T 指定为模板并且不能让它用参数类型定义自己?