c++11的右值引用

1.什么是右值引用

C++98首次提出了引用,引用就是给一个对象取别名,这个叫左值引用

C++11提出了右值引用,右值引用通常是常量,表达式,函数的返回值等的临时变量

左值引用和右值引用都是取别名

只不过,左值引用主要是给变量取别名,而右值引用主要是给常量取别名

//eg:

         int a=10;

         int &x=a;//这里就是左值引用

         int && s=10;//这里就是右值引用

         int &&s1=a+10;//右值引用

左值不一定是左边的值,右值不一定是右边的值

左值通常是变量(const 的左值引用除外)

例如:

const int &a=10;//此时就可以用左值引用来引用常量。
var code = "43fddf55-e9d6-488e-8d79-f7870fac566c"

所以左值引用并不一定只能引用常量,只是通常引用变量

右值引用也是如此,并不一定只能是常量

int a=10;

int&& s=move(a);//右值引用能引用move后的左值(即变量)

2.右值引用的将亡值(用例string拷贝构造函数的的现代写法)

C++11又将右值分为:纯右值和将亡值

纯右值:基本类型的常量和临时对象

将亡值:自定义类型的临时对象(重要作用)

在拷贝构造函数的时候,如果要拷贝一个临时的对象,那么效率就会很低,需要创建一个临时对象,然后再深拷贝

但是如果用右值引用,来进行移动拷贝,那么效率高的多

比如:

string(const string& s ){//这里就是左值引用的深拷贝

strcpy(_str,s._str); }

string (string&& s):_str(nullptr){

swap(s,nullptr);//直接将临时对象变成自己的了 }

//例子就是

string s1(string("右值临时对象"))//右值移动拷贝

传过来的是将亡值,反正你要亡了。随着临时对象的构造就消失了,不如给我,用右值引用引用这,然后我给你一个空指针,临时对象析构的时候析构空指针,原来的给我

posted @ 2024-01-17 16:35  有志者事竟成1019  阅读(28)  评论(0)    收藏  举报  来源