为什么std :: move采用forward_reference而不是lvaue引用

RaG*_*__M 6 c++ move-semantics c++11

只是为了证实我的理解 std::move

std::move-转换T&T&&,这样的T's举动构造会踢(如果它已经存在,否则拷贝构造函数会发挥它的作用,除非我们不是外部被删除的举动构造函数/分配).

当我看到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);
}
Run Code Online (Sandbox Code Playgroud)

它使用的原因remove_reference<T>是因为在forward_reference上应用了引用折叠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,"");
Run Code Online (Sandbox Code Playgroud)

static_assert 没有失败.

而且我也相信,意味着的价值类别std::movelvalue这样的情况moveInQuestion可能会好于std::move

T.C*_*.C. 8

通常的例子是通用代码

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

有了您move,这打破的时候Tbool,因为在这种情况下x[0]是prvalue代理引用,而不是一个左值.