刷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:以上都是个人理解,如有错误还望指点。

最新文章

  1. fragment (1)简单示例:定义,界面配置,fragment之间的跳转
  2. linux下OpenCV的安装配置
  3. 【python,logging】python中的logging模块
  4. httpsClient
  5. 物联网操作系统HelloX开发者入门指南
  6. C#汉字转换拼音技术详解
  7. 17.2.2.1 The Slave Relay Log Slave中继日志
  8. Android中Style和Theme的使用
  9. NSIS脚本调用C语言写的插件
  10. Math.random与java.util.Random的差别
  11. Oracle cloud control 12c 怎样改动sysmanpassword
  12. Redis简单几步
  13. JS的Dom树小结
  14. iOS UITableView左滑操作功能的实现(iOS8-11)
  15. MVVM简介与运用
  16. html5滑动事件代码
  17. 自定义Log 写到文件中
  18. 运维与自动化系列③自动化部署基础与shell脚本实现
  19. 【python】ftp连接,主被动,调试等级
  20. Linq 之 Select 和 where 的用法

热门文章

  1. RCC 2014 Warmup (Div. 2) 蛋疼解题总结
  2. hdu2852 KiKi's K-Number
  3. vue.js中的路由vue-router2.0使用
  4. [bzoj2657][Zjoi2012]旅游 journey_ 对偶图_树形dp
  5. 洛谷—— P1339 [USACO09OCT]热浪Heat Wave
  6. Eclipse代码/目录虚线对齐设置
  7. NetCore +EFCore+SqlServer根据数据库生成实体类到项目中
  8. CN Internet
  9. Android系统编译时遇到的几个.mk的疑惑。
  10. PowerDesigner中导入MYSQL数据库结构的步骤及问题解决