移动语义std :: move如何使用它

Gui*_*e07 3 c++ rvalue-reference visual-c++ move-semantics c++11

#include <type_traits>

template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
    return v;
}

void main()
{
    int a;
    move(a);
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码不能编译?

错误C2440:'return':无法在'int &&'中转换'int'

Joh*_*itb 6

v是return语句中的左值(出于安全原因,命名为rvalue引用是左值),但返回类型move是右值引用(Tint&,但是删除了引用,因此您int &&在返回类型中形成类型).

你需要static_castv,以remove_reference<T>::type &&第一次创建一个未命名的右值引用,当你想退货.

我不确定你的目标是什么.你想要使用std::move(就像你在标题中所说的那样),或者你想要了解它是如何实现的(就像你展示的代码所示).在std::move不了解基本C++规则的情况下尝试学习如何工作是没有意义的.我建议你看看我们的C++图书清单.掌握了C++之后,您可以了解它的std::move工作原理.

  • 未命名的右值引用也称为xvalues;) (2认同)