• 左值与右值引用 详解


     说明

    顾明思议

    左值引用 就是对左值的引用 就是给左值取别名

    右值引用 就是对右值的引用 就是给右值取别名

    当改变别名是 该值也相应的改变

    那么 何以区分哪些是左值哪些是右值呢?

    左值右值
    在内存中有特定地址的量 在寄存器中的量

    因为申请的变量会在内存中开辟一块地址 左值也叫有特定地址的量

    比如:

    int a=10;            //a 是左值
    
    double b=1.3;		 //b 是左值
    
    左值引用
    
    int & Ta=a;	    	//引用左值   故 是一个左值引用
    
    double & Tb=b;	    //引用左值 故是一个左值引用
    

    那么 何么 寄存器中的量又是什么?

    通俗的说 寄存器量 就是 运算值、函数返回的临时变量或者常量
    这些都有一个共同特点 :都不可对其取地址

    比如:

    'a'  是常量  故为右值
    3    是常量  故为右值
    1+3     运算会将 1+3 的结果保存至 寄存器 此时并不在特定的内存位置 故 该值为右值 是临时变量 
          
    int add()
    {
    	return 0;
    }   		//该函数返回的值并不会保存在内存中 仅出现在临时量中  语句执行完毕后 该临时量被销毁
    
    
    右值引用
    
    char && a="a";	        //常量 
    int && b=1+3; 	        //临时变量
    int&& c= add();   	    //函数引用
    

    重点:

    不可将左值引用 到 右值

    不可将右值引用 到 左值

    左值引用实例

    #include<iostream>
    using namespace std;
    int main(void)
    {
    	int a=10;                //左值
    	int & In_a=a;            //左值引用
    	cout<<"Old:"<<In_a<<endl;	
    
    	In_a=2;	          	     //改变别名
    	cout<<"New:"<<In_a<<endl;
    	
    	return 0;
    }
    

    结果:


    当左值引用右值时:

    右值引用实例

    #include<iostream>
    using namespace std;
    
    int add()
    {
    	return 0;
    }										//返回常量 0
    
    int fun(int&& f)						//形参为右值引用
    {
    	cout << f << endl;
    	return 1;
    }										//返回常量 1
    int main(void)
    {
    	'a';								//常量 'a'
    	3;									//常量  3
    	1 + 3;								//寄存器量 1+3结果 4 
    
    	//使用右值引用
    
    	char && Char_a = 'a';
    	cout << "'a':" << Char_a << endl;
    
    	int && Int_a = 3;
    	cout << "3:" << Int_a << endl;
    
    	int && Int_b = 1 + 3;
    	cout << "1+3:" << Int_b << endl;
    
    	int &&Int_c = add();
    	cout << "add()return 0:" << Int_c << endl;
    
    	int && Int_d = fun(3);    //输出3
    	cout << "fun() 3:" << Int_d << endl;
    	
    	return 0}
    

    结果


    当右值引用左值时:
    在这里插入图片描述

    以上为 左值右值引用规则 及使用方法

    但 模板引用则不同
    这是因为 自动推到类型优化后的结果

    如:

    #include<iostream>
    
    using namespace std;
    
    template<typename T> 					//函数模板
    void fun(T&& f)							//兼容 左值引用 和右值引用
    {
    	cout << f << endl;
    }
    
    
    
    int main(void)
    {
    	int a = 10;
    	fun(a);
    	fun(3);	   //兼容 左值引用 和右值引用
    
    
    	return 0;
    }
    

    结果
    在这里插入图片描述

    但当我们 提供左值引用版本时 便会优先匹配左值引用版本

  • 相关阅读:
    android sdk manager 更新问题
    Java static的使用 --Java笔记
    day98-django-ORM操作,创建表,表的增删改查,CBV操作
    day97-django-自带分页
    day96-django-分页模块(自定义)
    day95-django-子版继承母版
    day94-django-cookie登录校验
    day92-django-pymysql操作mysql封装之优化版,自定义的sqlhelper.py模块
    day91-django学生列表之增删改查(模态框-ajax提交)
    day90-django学生列表之增删改查(form提交)、思路、关于ajax的知识点
  • 原文地址:https://www.cnblogs.com/char-cheng/p/11026936.html
Copyright © 2020-2023  润新知