【发布时间】:2017-02-19 15:44:24
【问题描述】:
最近我一直在尝试理解移动语义并提出了一个问题。
这个问题已经讨论过here。
我实现了第一个变体并检查它返回的是左值还是右值:
#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 为模板,又不能让它自己定义参数类型呢?
【问题讨论】:
-
你为什么要获取r值引用的地址?
-
@BlackMoses 检查 r 值。
-
@LogicStuff 啊,好吧,还以为是对
&用法的误解:) -
检查它是右值还是左值。基本上是为了在链接的帖子中证明错误的第一个答案第一个问题是你可以编写 std::forward(x),它不会做你想要的,因为它总是产生左值引用。
-
你真的应该用转发引用来测试它——你只能用模板参数来测试它。使用变量在 main 中进行测试,您不能将转发引用传递给您的 my_forward。
标签: c++ c++11 move-semantics c++-standard-library lvalue-to-rvalue