(3)左右值再探与decltype
Decltype 类型指示符
“引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外”
理解:
Decltype和auto区别:
1. auto是从表达式类型推断出要定义的变量类型(这里的表达式是auto声明语句里的右值表达式),且用该表达式的值去初始化。而decltype虽然也是从表达式类型推断要定义的变量类型,但是不会用该表达式的值去初始化(这里的表达式是左值表达式?)
2. decltype的结果类型与表达式形式密切相关(表达式只有变量和表达式不止有变量)
第二点就是理解这里的关键,对于decltype来说,如果表达式是变量名加上括号得到的就是一个引用(加括号的时候编译器将其视为表达式而不是变量):
int i=0;
decltype((i))d; //d是一个int引用,必须初始化
decltype(i)d; //d是一个普通的int
因此对于:
Decltype(*p)c //c是一个int&,即引用。
在这里,引用和*p联系到了一起,这就是那个例外。
那么,为什么会是这样呢?
此外,为什么变量加个括号,在decltype中就会返回引用类型呢?
这一切都和区别2和左右值在decltype中的应用有关。
首先我们要明确,decltype中,表达式只有变量不会出现这种差异,变量是什么就返回什么;只有在表达式不止是变量时会有不同。
表达式之所以不同,是因为decltype此时是根据表达式的结果来返回对应的类型.那么表达式的结果有哪些呢?
1.表达式的结果对象能作为一条赋值语句的左值时,decltype返回的是引用类型
想到这,有必要再次深入了解C++中的左右值区别了。之前存的文章:
https://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues
以及最近在看的网络课笔记:
http://www.cnblogs.com/wuduojia/articles/7635635.html
派上了用场,接下来就是自己试着合起来理解一下。
首先是stack overflow里高票答案的理解:
一切的原因可能是因为移动时全语义的变化(全语义的意思见网络课笔记)。一旦我们对表达式进行移动而非复制,很容易就能看出在不同表达式上移动的区别。根据我对草案的理解,我认为rvalue和lvalue的概念和以前一样,只是在移动时更加细分了这个概念。
为什么需要它?也许并不是我们想的那样即定义不一样了,而是定义的更加精确了而已。
1.lvalue=left value=左值
2.xvalue =expiring value=消亡值
3.glvalue =generalized lvalue=泛左值
4.rvalue=right value=右值
5.prvalue =pure rvalue=纯右值
由于英语差,感觉自己理解的这五种值不对,又去查了资料:
https://www.zhihu.com/question/22111546
https://www.2cto.com/kf/201602/489942.html
https://www.zhihu.com/question/39846131
发现这些答案应该可以说清楚了,但是很多基础性的东西还不懂,无法理解!所以决定先放一放,以后再回头理解!
暂时先按照这篇文章的理解:
http://www.cnblogs.com/wuchanming/p/3751847.html
“使用关键字decltype的时候,左值和右值也有所不同。如果表达式的求值结果是左值,decltype作用于该表达式(不是变量)得到一个引用类型。举个例子,假定p的类型是int* ,因为解引用运算符生成左值,所以decltype(*p)的结果是int&。另一方面,因为解地址运算符生成右值,所以decltype(&p)的结果是int**,也就是说,结果是一个指向整型指针的指针;赋值也会产生引用,引用的类型就是左值的类型:
int a = 3, b = 4;
decltype(a = b)d = a; //d是int&
即暂时理解为对象是左值,值是右值。当表达式返回的值是左值给decltype时得出的结果是引用。
所以:
int i=42;*p=&i;&r=i;
decltype (r+0)b; //r+0的结果是一个具体值42,是一个右值,所以返回给decltype的类型是int
decltype(*p)c; //*p是解引用p,得到的是一个对象,所以返回给decltype的类型是int引用
(3)左右值再探与decltype的更多相关文章
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- 深入出不来nodejs源码-内置模块引入再探
我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...
- 再探Redux Middleware
前言 在初步了解Redux中间件演变过程之后,继续研究Redux如何将中间件结合.上次将中间件与redux硬结合在一起确实有些难看,现在就一起看看Redux如何加持中间件. 中间件执行过程 希望借助图 ...
- c++再探string之eager-copy、COW和SSO方案
在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- LWIP再探----内存堆管理
LWIP的内存管理主要三种:内存池Pool,内存堆,和C库方式.三种方式中C库因为是直接从系统堆中分配内存空间且易产生碎片因此,基本不会使用,其他两种是LWIP默认全部采用的方式,也是综合效率和空间的 ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
随机推荐
- 苹果Macbook Air怎么安装Win7系统图解教程
下面开始我们在苹果Macbook Air上的Windows7之旅吧.
- pydevd 一次trouble shooting
只是一次小的trouble shooting. 關於python的遠程調試功能.但是由於思路混亂.浪費了許多時間,記錄一下整個過程.作爲改進的參考. 问题背景: 我之前一直在ubuntu上用pycha ...
- 【CV论文阅读】Detecting events and key actors in multi-person videos
论文主要介绍一种多人协作的视频事件识别的方法,使用attention模型+RNN网络,最近粗浅地学习了RNN网络,它比较适合用于处理序列的存在上下文作用的数据. NCAA Basketball数据集 ...
- hdu 4291 矩阵幂 循环节
http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙: g(g(g(n))) mod 109 ...
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- C#.NET 无法直接启动带有类库输出类型的项目怎么办
我把Driver.cs文件去掉了一行注释,发现报错 右击这个解决方案,选择属性,然后再启动项目中改成MySample
- 11gR2 RAC环境重建ASM SPFILE
有关11gR2 ASM spfile说明能够看 http://blog.csdn.net/robo23/article/details/41930051 下面粘出spfile重新启动过程: +++1) ...
- 如何在其他js 引入main.js 中 vue 的实例?
1.原因解析 经测试发现,代码先执行了 index.js >> main.js >> Home.vue scr/api/index.js src/main.js src/co ...
- 利用vue-cli配合vue-router搭建一个完整的spa流程
好文章备忘录: 转自:https://segmentfault.com/a/1190000009160934?_ea=1849098 demo源码:https://github.com/1590123 ...
- Django打造大型企业官网(四)
4.3.轮播图布局和样式 templates/news/index.html <div class="news-wrapper"> <div class=&quo ...