为什么std :: move()在c ++中工作?

6 c++ c++11 value-categories stdmove

以下是代码段:

int i=0;
int&&k=std::move(i);
Run Code Online (Sandbox Code Playgroud)

在c ++入门中,此举是

template <typename T>
typename remove_reference<T>::type &&move(T&& t)
{return static_cast<typename remove_reference<T>::type&&>(t);}
Run Code Online (Sandbox Code Playgroud)

据我所知,这个std::move模板会扣除一个像这样的函数

int&& move(int& t){return static_cast<int&&>(t);}
Run Code Online (Sandbox Code Playgroud)

作为比较和阐述我的问题,请考虑这样的示例:

 int test(int k){k=66;return k;}
 int k;
 int a=test(k);
Run Code Online (Sandbox Code Playgroud)

上面的代码将编译为:

int temp;//the temporary object
temp=k;
int a=temp;
Run Code Online (Sandbox Code Playgroud)

同样,我认为第一个代码片段将被编译为:

int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!
Run Code Online (Sandbox Code Playgroud)

这似乎是错误的,因为它temp是一个左值,我有什么不对吗?

son*_*yao 4

同样,我认为第一个代码片段将被编译为:

int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!
Run Code Online (Sandbox Code Playgroud)

您可能会将类型值类别混淆.

每个C++表达式(具有操作数,文字,变量名等的运算符)的特征在于两个独立的属性:类型值类别.

int&&k=std::move(i);并且int&& k=temp;是不相同的.返回类型std::move是rvalue-reference,然后std::move返回的是rvalue(更准确地说是xvalue),它可以绑定到rvalue-reference.在另一方面temp是一个命名的变量然后它总是一个左值,而不管其类型是int,int&,int&&等等左值不能被绑定到右值参考.

关于左值的更多信息:

以下表达式是左值表达式:

  • 变量的名称,......

xvalue(rvalue):

以下表达式是xvalue表达式:

  • 函数调用或重载的运算符表达式,其返回类型是对象的右值引用,例如std::move(x);
  • ...
  • 一个强制转换表达式,以引用对象类型的rvalue,例如static_cast<char&&>(x);

  • @ user9396941类型和值类别是不同的东西.函数的返回类型是`int`,函数返回的是prvalue; 类似地,`int&`=> lvalue,`int &&` => xvalue.对于命名变量`temp`,它的类型是`int &&`,它是一个左值.命名变量总是一个左值,无论它的类型是`int`,`int&`,`int &&`等. (2认同)