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的更多相关文章

  1. 再探jQuery

    再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...

  2. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  3. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  4. 深入出不来nodejs源码-内置模块引入再探

    我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...

  5. 再探Redux Middleware

    前言 在初步了解Redux中间件演变过程之后,继续研究Redux如何将中间件结合.上次将中间件与redux硬结合在一起确实有些难看,现在就一起看看Redux如何加持中间件. 中间件执行过程 希望借助图 ...

  6. c++再探string之eager-copy、COW和SSO方案

    在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...

  7. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  8. LWIP再探----内存堆管理

    LWIP的内存管理主要三种:内存池Pool,内存堆,和C库方式.三种方式中C库因为是直接从系统堆中分配内存空间且易产生碎片因此,基本不会使用,其他两种是LWIP默认全部采用的方式,也是综合效率和空间的 ...

  9. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

随机推荐

  1. dataTables 添加行内操作按钮

    在上一篇博客中我们提到了用dataTables 做一个分页表格.今天进一步进阶,做一个行内带操作按钮的表格.效果如图. 记得最基础的实现方式是,我们要在js 中拼接字符串,嵌入一个带按钮的语句.但是现 ...

  2. 怎样把UCos-ii_在STM32上的移植

    下载代码 stm32 标准外设库是 stm32 全系列芯片的外设驱动,有了它能够大大加速我们 开发 stm32. 首先从 st 公司的站点下载最新的 stm32 标准外设库,写本文时最新的版本号是 V ...

  3. JAVA —— String is immutable. What exactly is the meaning? [duplicate]

    question: I wrote the following code on immutable Strings. public class ImmutableStrings { public st ...

  4. JS原生DOM操作总结

    DOM的主要操作——增.删.改.查节点 (1) 查找节点 document.getElementById('div1') document.getElementsByName('uname') doc ...

  5. 【Android】应用安全——反编译

    用java开发最操心的就是得到反编译,所以作为开发人员我们须要知道怎么反编译,那样才干知道怎样防止反编译.保证代码安全. 以下来看下比較经常使用的方法! 第一种方式:利用apktool反编译 1,首先 ...

  6. POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5660   Accepted: 202 ...

  7. Mariadb 主从

    一 mariadb主从多用于网站架构,因为该主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构 ...

  8. SSH-struts2的异常处理

    在学习j2se的时候学习过利用java的exception类去处理异常.在struts2框架中也提供了对于异常的处理.简单说就是当Action发生异常时.能够在struts2.xml文件里进行配置,将 ...

  9. Codeforces(429D - Tricky Function)近期点对问题

    D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  10. C中 数组和指针的异同

    数组在很多情况下是和指针等价的,数组的下标运算和指针的解引用也有等价形式:arr[i] == *(arr + 1):但是也有一些情况下数组和指针是不一样的:extern int arr[]; exte ...