int main()
{
int rx = 0;
int ry = std::move(rx); //here is the point of my question
int lx = 0;
int ly = &lx; //(2) obviously doesn't compile
std::cin.ignore();
}
我对rvalue的这个方面有点迷失,我无法理解我们怎么不能将&& rx绑定到ry,因为std :: move(rx)是对rvalue的引用,所以我相信这种表达式只能绑定到引用类型,就像左值引用的情况一样,并在(2)中说明
答案 0 :(得分:3)
引用!=运营商的地址。
int& ly = lx; // reference
int* ly = &lx; // pointer
答案 1 :(得分:2)
std :: move获取其参数的右值引用并将其转换为xvalue。 [1]
反过来可以将其复制到ry
。
表达式int ry = std::move(rx);
不会将rx
“绑定”到ry
。它告诉编译器不再需要rx
,并且可以将其内容移动到ry
,同时使rx
无效。
当函数按值返回时,这尤其有用:
std::vector<int> foo() {
std::vector<int> v = {1,2,3,4};
return v;
}
std::vector<int> u = foo();
在return v
,编译器注意到不再需要v,它实际上可以直接将其用作u
,而无需对矢量内容进行深层复制。