为什么std::move采用forward_reference而不是左值引用?

6

确认一下我对 std::move 的理解是否正确:

std::move - 将 T& 转换为 T&&,以便触发 T 的移动构造函数(如果存在的话,否则复制构造函数将发挥其作用,除非我们外部删除了移动构造函数/赋值)。

当我查看可能的 std::move 实现时,它是这样的:

template<typename T>
typename remove_reference<T>::type&& move(T&& param)
{
using ReturnType =typename remove_reference<T>::type&&;
return static_cast<ReturnType>(param);
}

它使用remove_reference<T>的原因是由于对前向引用T&&应用的引用折叠。

我只是想知道为什么我们需要前向引用,难道我们不能通过

template<typename T>
T&& moveInQuestion(T& p){
  return static_cast<T&&>(p);
}

struct someType{};
someType lvalref;
static_assert(is_same<decltype(moveInQuestion(lvalref)),decltype(std::move(lvalref))>::value,"");

static_assert 没有失败。

我认为,用于 std::move 的值类别是一个 lvalue。如果是这种情况,moveInQuestion 是否可能比 std::move 更好?

1个回答

8

通常的例子是类似以下的通用代码:

template<class T>
T frob() {
    std::vector<T> x = /* ... */;
    return std::move(x[0]);
}

Tbool时,您的move无法正常工作,因为在这种情况下,x [0]是一个prvalue代理引用而不是lvalue。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接