c++ 右值引用

右值引用
摘取自Seayoki的知乎 C++有多难
c++中等号(=)代表拷贝,然而c++想赋予等号(=)不一样的功能,即转移资源的所属功能,这个功能通过右值引用实现

int a;
a = 3;
int& h1 = a;
int&& h2 = std::move(a);

int a;会分配 32 bits 的空间。int& h1 = a; 就是左值引用,如果对 a 进行任何修改,都会应用到 h1。
int&& h2 = std::move(a); 就是右值引用,如果对 a 进行任何修改,都会应用到 h2。从用法上看,似乎左值
引用和右值引用看起来毫无区别。但是从编译器底层来看,int a 和 int& h1 占用两份内存,也就是 double 32 bits。
而 int a 和 int&& h2 只占用一份内存,也就是32 bits。通过使用右值引用,我们可以节省出更多的空间给其他代码使用。
右值引用一般要这么写

int hello(){ return 1; }
int &&h1 = 3;
int &&h2 = hello();

函数的返回值和字面值会被编译器自动当作右值处理,不用加std::move();

int a{ 3 };
int &&h1 = std::move(a);

普通变量不会被当作右值处理,需要加std::move();// wrong !!!

int&& hello() {...}
// correct!
int& hello() {...}

注意,返回值类型不需要为右值,因为编译器会自动把返回值类型当作右值处理,所以最常见的返回值类型是普通类型或者引用类型。

int hello() { return 1; }
int&& h1 = hello();

对于每个函数而言,一旦函数执行完毕,所有局部变量按顺序出栈,依次销毁。
此时函数会返回一个右值,这个右值可以"移动"(not copy)到另一个变量身上。

posted @ 2021-08-05 20:30  fashow  阅读(97)  评论(0编辑  收藏  举报