为什么rvalue引用可以绑定到非引用类型

时间:2013-12-29 11:16:05

标签: c++11 rvalue-reference

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)中说明

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,而无需对矢量内容进行深层复制。