auto是C++11标准推出的用于依据初始化表达式来推断变量类型的关键字。
与decltype不同,auto推断的时候,一般会忽略掉顶层const:
比如

// 目标是const int
const int a = 10;
auto b = a;

此时,b的类型是 int,而不是 const int。

当遇到指针时:

// 目标是const int的地址
const int a = 10;
auto b = &a;

此时,b的类型是 const int *(指向常量的指针),而不是 const int * const 或者 int * const。
这里需要注意:当对常量对象取地址时,属于底层const,而auto一般忽略顶层const,而不忽略底层const,因此会产生 const int *。

当遇到引用时:

// 代码段1,目标是const int
const int a = 10;
auto &b = a;
// 代码段2,目标是c
const int a = 10;
const int &c = a;
auto b = c;

此时,
代码段1中,b是 const int &,等于是 const int &b = a; 这里要注意的是,b是一个引用,修饰引用的const,都是底层const,原因也很简单,引用在初始化时绑定到对象,后期无法再次绑定,引用本身已经包含了顶层const的含义,那么再用const来修饰引用,只能是底层const的效果了,即无法通过该引用来修改引用对象的值。
代码段2中,b是 const int,注意b此时不是引用,而是一个对象了。原因是,当表达式是引用的时候,会按照引用的对象的类型进行推断。

C++ auto与顶层const和底层const的关系相关推荐

  1. 顶层const和底层const

    auto 会去掉引用,去掉顶层const,这块知识又重新看了一下. 首先要知道,顶层和底层const只有指针类型才有, 先看一下普通类型 const 常量,初始化之后就不可变. const int a ...

  2. char类型的实参与const char类型的形参不兼容_C++干货系列——顶层const和底层const...

    顶层 const 和底层 const 学C++的小伙伴是不是被const机制搞得晕头转向,永远都记不住哪个是指针不能变哪个是指针指向的对象不能变?纯靠记忆肯定不行,理解透彻才能一劳永逸.本文详细介绍了 ...

  3. 【c++】c++中顶层const与底层const

    首先看下定义 顶层const是指   const修饰的是指针,即此指针是常量指针,一旦指向某个对象,则不能指向其他对象 底层const是指  const修饰的是指针所指向的对象为常量,不能通过指针去修 ...

  4. 顶层const和底层const的含义和区别

    首先,顶层const和底层const都是相当于指针而言的,比如说const int a,这个const既不是顶层也不是底层,因为a不是指针. 其次,如何看const是修饰的什么呢. 原则是谁在cons ...

  5. C++ Primer笔记——顶层const和底层const区别

    顶层const和底层const的区别 书中的定义: 顶层const(top-level const):表示指针本身是个常量. 底层const(low-level const):表示指针所指的对象是一个 ...

  6. 顶层const和底层const的区别

    指当指针指向一个对象时,若指针本身为常量,则为顶层const:如果const是指指针指向的对象不可改变,指针本身可以改变,则叫做底层const

  7. 1.C和C++区别,以及const分析(底层const/顶层const)

    从本章起开始从0学习C++,本章主要内容: 1)C和C++的基本区别 2)C和C++的const区别 1.C++和C区别 1.1 C++更强调语言的实用性,所有变量都可以在需要时再定义 比如: for ...

  8. 顶层const与底层const

    指针本身是一个对象,它又可以指向另外一个对象.因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题. 用名词顶层const(top-level const)表示指针本身是个常量, ...

  9. int const *和int * const以及const int * const的区别

    int const *是一个指向常量整数的指针 指向了一个不能被修改的值但是指针指向的地址可以改变 const在数据类型的一侧,所以可以放在int的前面const int *,(从c++ prime了 ...

最新文章

  1. [CSAcademy]Virus on a Tree
  2. 子窗体 记录选择_如何设计一个简单的Access登录窗体(1)
  3. Future源码解读
  4. JEECG Framework 3.3.1 beta版本发布第一天战报(文档下载量破1300、代码下载量破700)
  5. 数据:DOGE近24小时交易额约为107.91亿美元
  6. Linux期末考试模拟试题
  7. 个人主页,引导页,导航网站源码三分钟下载安装【美观大气】
  8. error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools,亲测100%安装
  9. 高考作文《细雨闲花》
  10. 有赞测试新人训之探索与实践
  11. 【Linux】gcc/g++区别和联系
  12. Centos 7.9挂载群晖NAS
  13. mysql assoc什么意思_mysql_fetch_assoc 报错
  14. Pokémon Army (easyversion) -每天一把CF - 20201007
  15. 信捷plc c 语言全局变量,三菱PLC编程中,跳转指令CJ、子程序调用CALL和中断指令有什么区别?...
  16. IPEndPoint 和 EndPoint
  17. html5播放加速,html5倍速播放插件
  18. antd 给input设置值_React中input框设置value报错解析
  19. 别了,开拓者的小伙们!
  20. 2007年。。。。。

热门文章

  1. JNPF快速开发平台 3.4新版本 企业版旗舰版 框架源码目录 大屏设计 大屏源码
  2. 计算机格式设置实验,Word实验3 页面格式设置
  3. Subject 与 Observable 的区别
  4. 计算机网络教研室活动总结,计算机教研室工作总结范文
  5. @InitBinder注解使用
  6. pygame6 弹球游戏
  7. 智能家居android原理图,智能家居控制系统原理及结构图详解
  8. php语言推送,PHP语言的 OPPO通道消息推送
  9. 对变压器进行多点温度测量
  10. 花了个把小时,终于把vs2015 profession版卸载了(亲测)