左值与右值引用 详解

说明

顾明思议

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

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

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

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

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

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

比如:

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;
}

结果

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

原文地址:https://www.cnblogs.com/tinaluo/p/11440984.html

时间: 2024-08-29 16:38:54

左值与右值引用 详解的相关文章

[转]C++11 左值、右值、右值引用详解

https://blog.csdn.net/hyman_yx/article/details/52044632 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址:表达式b+c.函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名

翻译「C++ Rvalue References Explained」C++右值引用详解 Part3:右值引用

本文为第三部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 右值引用 如果x是任意类型,那么x&&则被称作一个对x的右值引用(rvalue reference).为了更好区分,原来的引用x&现在也被称作左值引用(lvalue reference). 一个右值引用是一种同原始引用x&的行为非常类似的类型,但是有一些特例.最重要的一个就是当面临方法重载决议的时候,左值倾向于旧式的左值引用,而右值偏向于新的

翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述

本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker. 该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scott Meyers推荐,全文共分11个部分,我将利用业余时间,分别翻译. 受笔者水平所限,可能叙述会出现些许问题,还望多多指正. 部分名词为了保持含义和方便理解,并未翻译成中文,有的在括号内给出了常见的中文翻译. 目录 概述 Move语义 右值引用 强制Move语义 右值引用就是右值吗? Move语义

引用、左值与右值

我的理解 引用是一个左值,而常量引用是一个右值.两者最关键的地方在于,左值可以被取到地址,而右值取不到地址,这个性质就决定了右值不能在 "=" 的左侧. 从汇编角度去理解这个问题的话,就很好理解了,左值是一个内存单元里的数据,我们可以直接寻址找到它,而右值是一个立即数或者是寄存器里的值. C与C++中的左值.右值 C 中可以通过赋值号 "=" 简单地判断,比如 int a = 42; // 表达式a是左值,字面值常量42是右值 int b = 43; // 表达式b

C++11之右值引用:从左值右值到右值引用

C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是可以取得内存地址的变量. 非左值即为右值. 从这里可以看出,可以执行&取地址的就是左值,其他的就是右值. 这里需要明确一点,能否被赋值不是区分C++左值和右值的区别. 我们给出四个表达式: string one("one"); const string two("two&

左值、左值引用、右值、右值引用

1.左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值:左值必须要在内存中有实体:         右值当在赋值号右边取出值赋给其他变量的值:右值可以在内存也可以在CPU寄存器.         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址. 2.引用 引用是C++语法做的优化,引用的本质还是靠指针来实现的.引用相当于变量的别名. 引用可以改变指针的指向,还可以改变指针所指向的值. 引用的基本规则: 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他

C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理解C++ 11中这些比较重要的特性. 关于左值和右值的定义 左值和右值在C中就存在,不过存在感不高,在C++尤其是C++11中这两个概念比较重要,左值就是有名字的变量(对象),可以被赋值,可以在多条语句中使用,而右值呢,就是临时变量(对象),没有名字,只能在一条语句中出现,不能被赋值. 在 C++1

左值、右值、右值引用与move()、forward()

1.左值(lvalue):可以进行取地址(&)运算的是左值.或者有时候可以理解为 既能够出现在等号左边也能出现在等号右边的变量(或表达式). 2.右值(rvalue):不可以进行取地址(&)运算的是右值.或者有时候可以理解为 只能出现在等号右边的变量(或表达式). 常见的右值有 字面量.函数返回的临时对象,匿名对象等. 以上判断一个对象是左值还是右值并不完全正确. const int c_a = 10; //左值,但是不能被赋值,也就不能出现在 = 左边 //字符串字面值,可以取地址,是左

c++ -- 左值和右值

总结--C++ primer 5 一.左值和右值(P121) 1. 概念 C++的表达式,要不然是右值,要不然是左值. 这两个名词继承与C语言,在C中是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能.在C++中,二者的区别没那么简单:当一个对象被用作右值的时候,用的是对象的值(内容):当对象被用作左值的时候,用的是对象的身份(在内存中的位置). 一个重要的原则(P470有一个例外):在需要右值的地方可以用左值来代替,但是不能把右值当成左值(也就是位置)使用.当一个左值被当成右值使用时,实际