刷primer看到原文讲到"引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外。",我很是好奇。

这个“引用”当然是指引用类型,like this:

int i =;

int &r= i;

r就是引用类型,的确如上文所说,它从来都是作为"所指对象" i的同义词出现。

如果使用decltype 关键字推断 r 的类型:

decltype(r) d;  //会报错

在vs中会报错,提示"引用变量d需要初始值设定项",同时可以移动鼠标到 d 上,vs会提示 d的类型为 int& d 。

正确代码应该是这样:

decltype(i) a=;// a 是int 类型

decltype(r) d= a;// 等同于 int & d=a;

到这里为止依旧符合原文“引用从来都作为其所指对象的同义词出现”。

那么它的“只有用在decltype处是一个例外”在哪呢?

如下代码:

int *p=&i;
decltype(*p) c;

vs报错提示:"引用变量c 需要初始值设定项",似曾相识。同时可以移动鼠标到 c 上,vs会提示 c 的类型为 int &c 。

这就纳闷了,讲道理我一个 int * 类型 就这么变成一个 int & 类型了呢?

原文说到“有些表达式将向decltype 返回一个引用类型。一般来说这种情况发生时,意味着该表达是的结果对象能作为一条赋值语句的左值

以下面为例:

int i =,*p=&i,&r=i;
decltype(i) a=;
decltype(r) b=a;
decltype(r+) c=;
decltype(*p) d =a;

decltype(i) a 得到一个int 类型变量a ,我们初始化为0。

decltype(r) b 得到一个int& 类型变量b ,即一个 int类型引用 需要绑定一个int变量,我们绑定到a。

这就是向decltype返回一个引用类型,表达的结果对象 b能做一条赋值语句的左值,没毛病。

decltype(r+0) c来源于书上,r是引用,r+1表达式的结果是一个int值,等同于变量a.

decltype(*p) d ,*p的结果是一个 int 对象,即变量 i 。是不是可以等同于decltype(i) 从而得到int类型对象呢?

图样森破~前面已经在vs里验证了,decltype(*p)得到的是一个int&类型,书上的解释为*p生成左值,故得到int&.

这是关键,说明decltype(i)和decltype(*p)作用机理是不一样的。

原文:"解引用指针可以得到指针所指的对象,而且还能给这个对象赋值"

加粗部分是重点,能给这个对象赋值不就是说获得了对象的地址吗?

所以表达式 *p 同样得到 i 这个对象,但我们得到的其实是i变量的地址.而变量i呢?

对于其本身的操作有如下3种:

1、 int i;开辟内存空间

2、 int i =10; //这里的i为左值

3、 int b =i;

我们知道,类型区别就是内存空间字节长度区别,明显decltype(i)这里没有用到i变量的地址(用不上啊),或者说它功能就是读取i这块内存里存储的值.

不妨一试:

decltype(p)  e;

p是指针,但p自己的内存储存了一个地址,这个环境下decltype(p)除了类型不一样,没有区别。

最后,简单的说如果decltype()处理的不是表达式而是变量,那么返回变量类型.

否则根据表达式结果来给出返回的类型.

ps:以上都是个人理解,如有错误还望指点。

再战primer——decltype 和引用的更多相关文章

  1. uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

    #31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...

  2. A*搜索详解(2)——再战觐天宝匣

    书接上文.在坦克寻径的,tank_way中,A*算法每一步搜索都是选择F值最小的节点,步步为营,使得寻径的结果是最优解.在这个过程中,查找最小F值的算法复杂度是O(n),这对于小地图没什么问题,但是对 ...

  3. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

  4. 学长小清新题表之UOJ 31.猪猪侠再战括号序列

    学长小清新题表之UOJ 31.猪猪侠再战括号序列 题目描述 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫\(\_CallMeGGBond\). 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领 ...

  5. (3)左右值再探与decltype

    Decltype 类型指示符 “引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外” 理解: Decltype和auto区别: 1.     auto是从表达式类型推断出要定义 ...

  6. C++ Primer 第二章 引用 指针 const限定符

    1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...

  7. 再分析 返回值加引用&,const

    本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...

  8. 再谈c++中的引用

    在<从汇编看c++的引用和指针>一文中,虽然谈到了引用,但是只是为了将两者进行比较.这里将对引用做进一步的分析. 1 引用的实现方式 在介绍有关引用的c++书中,很多都说引用只是其引用变量 ...

  9. linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,日本再战!)

    linux 3.4.103 内核移植到 S3C6410 开发板 这个星期差点儿就搭在这里面了,一開始感觉非常不值得,移植这样的浪费时间的事情.想立刻搞定,然后安安静静看书 & coding. ...

随机推荐

  1. chrome浏览器中解决embed标签 loop="true" 背景音乐无法循环的问题。

    今天试了下在html网页中加入背景音乐并设置为循环播放.一开始用<embed>标签,设置loop="true", 但是结果发现在IE浏览器可以,但是在chrome浏览器 ...

  2. Microsoft 根证书计划弃用 SHA-1 哈希算法

    Microsoft 根证书计划弃用 SHA-1 哈希算法 微软官方2016年1月12日发布安全通报,自2016年1月1日起Microsoft 已经发布代码弃用变更,也就是说2016年1月1号后用SHA ...

  3. h5dnd sortable mutil groups

    h5dnd sortable mutil groups https://codepen.io/webgeeker/pen/JmPXaN https://codepen.io/webgeeker/pen ...

  4. POJ 2142 TheBalance 模线性方程求解

    题目大意: 就是将两种砝码左右摆放,能够在物品放置在天平上时保持平衡 很容易得到 ax + by = t的模线性方程 按题目要求,希望首先满足 |x| + |y| 最小 , 如果有多种情况,再满足所有 ...

  5. poj 2455

    题意:由一个点走到另一个点,中间的点可以重复到达,但边只能经过一次,问T条边不重复的路径里,最长的边的最小值. 分析:由于点是可以重用的,因此不必拆点.这道题有重边,而且重边都必须保留,因为点是可以重 ...

  6. 洛谷——P1255 数楼梯

    题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个数字,楼梯数. 输出格式: 走的方式几种. 输入输出样例 输入样例# ...

  7. SiteMesh基础教程

    SiteMesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架.它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等. 教 ...

  8. MAPZONE GIS SDK接入Openlayers3之四——高级标注效果实现

    首先看实现效果: 实现要点: 1)树形标注实现 2)复杂标注样式定义 3)效率优化 1.树形标注实现 树形标注采用字体符号来实现,包括以下几个步骤 1)载入字体 2)设置标注值与字体对照关系 3)设置 ...

  9. 【CV论文阅读】:Rich feature hierarchies for accurate object detection and semantic segmentation

    R-CNN总结 不总结就没有积累 R-CNN的全称是 Regions with CNN features.它的主要基础是经典的AlexNet,使用AlexNet来提取每个region特征,而不再是传统 ...

  10. 如何使用PHP显示在线Word文档

    在线生成FlashPaper文档 1 安装 FlashPaper2,最好下载绿色版的FlashPaper软件,如下所示,先点击初始化.bat即开始绿化,然后双击"FlashPrinter.e ...