6

以下是代码片段:

int i=0;
int&&k=std::move(i);

在 C++ 入门中,移动是

template <typename T>
typename remove_reference<T>::type &&move(T&& t)
{return static_cast<typename remove_reference<T>::type&&>(t);}

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

int&& move(int& t){return static_cast<int&&>(t);}

作为比较并详细说明我的问题,请考虑以下示例:

 int test(int k){k=66;return k;}
 int k;
 int a=test(k);

上面的代码将被编译为:

int temp;//the temporary object
temp=k;
int a=temp;

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

int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!

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

4

1 回答 1

4

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

int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!

您可能会将typevalue category混淆。

每个 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)
  • ...
  • 对对象类型的右值引用的强制转换表达式,例如static_cast<char&&>(x)
于 2018-02-22T15:05:33.080 回答