auto让编译器通过出初始值来推算变量的类型,显然,auto定义的变量必须有初始值:

//由val1和val2相加的结果可以推断出item的类型
auto item = val1 + val2;//item初始化为val1和val2相加的结果

使用auto也能在一条语句中声明多个变量,因为一条语句中只能有一种基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样:

auto i = , *p = &i;//正确:i是整数、p是整型指针
auto sz = , pi = 3.14;//错误:sz和pi类型不一样

复合类型、常量和auto

编译器推断出来的auto类型有时候和初始值的类型不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。

使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。

此时编译器以引用对象的类型作为auto的类型:

int i = , &r = i;
auto a = r;//a是一个整数

auto一般会忽略顶层const,同时底层const则会保留下来,比如当初始值是一个指向常量的指针时:

const int ci = i, &cr = ci;
auto b = ci;//b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr;//c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i;//d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci;//e是一个指向整数常量的指针(对常量对象的取地址是一种底层const)

如果希望推断出的auto类型是一个顶层const,需要明确指出:

const auto f = ci;//ci的推演类型是int,f是const int

将引用的类型设为auto,此时原来的初始化规则仍然适合:

auto &g = ci;//g是一个整型常量引用,绑定到ci
auto &h = ;//错误:不能为非常量引用绑定字面值
const auto &j = ;//正确:可以为常量引用绑定字面值
  • 设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。
  • 给初始值绑定一个引用时,则此时的常量就不是顶层常量。
auto k = ci, &l = i;//k时整数,l是整型引用
auto &m = ci, *p = &ci;//m是对整型常量的引用,p是指向整型常量的指针
auto &n = i, *p2 = &ci;//错误:i的类型是int而&ci的类型是const int

auto类型说明符的更多相关文章

  1. auto类型说明符的注意事项

    1.auto类型说明符,是C++11标准下的,它能让编译器自行判断表达式的类型. 2.auto也能在一条语句上声明多个变量,但是,该语句上的多个变量的类型,必须一致. 3.编译器推断出来auto类型可 ...

  2. C++11 auto类型说明符的使用

    编程的时候常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型.然而做到这一点很难,有时候根本做不到.为了解决这个问题.C++11新标准引入了auto类型说明符,用它就 能让编 ...

  3. C++ auto类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864612 编程时常常需要把表达式的 ...

  4. (2)左右值初探与auto类型说明符

    这篇文章的起因是下面这两段代码,出自<C++ primer 5th>中文版P62页: auto &h =42;//错误,不能为非常量引用绑定字面值 const auto & ...

  5. C++通过迭代修改字符串本身(auto类型说明符)

    以字符串这种支持 for (declaration : expression) statement 这样for语句迭代的数据结构为例,我们看看auto关键字在类型推断中的作用. string s = ...

  6. C++ decltype类型说明符(尾置返回类型使用)

    转自https://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 decltype 类型说明符生成指定表达式的类型.在此过程中,编译器分析 ...

  7. C++ decltype类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 declt ...

  8. Effective Modern C++翻译(3)-条款2:明白auto类型推导

    条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ...

  9. 现代C++之理解auto类型推断

    理解auto类型推断 上一篇帖子中讲述了模板类型推断,我们知道auto的实现原理是基于模板类型推断的,回顾一下模板类型推断: template <typename T> void f(Pa ...

随机推荐

  1. 迭代与JDB

    1.题目要求 2.程序设计 首先,命令行输入,还是考虑先将输入的数据转化为整型变量 然后,看到C(n,m)=C(n-1,m-1)+C(n-1,m)公式以及"迭代"这两个字,首先想到 ...

  2. yidiandian

    hzwer libreoj (需要拿新版的打开)

  3. 使用BigQuery分析GitHub上的C#代码

    一年多以前,Google 在GitHub中提供了BigQuery用于查询的GitHub上的开源代码(open source code on GitHub available for querying) ...

  4. 玩转PIL库

    1.安装pillow库: 在cmd下,输入简单的命令: pip install pillow  即可安装pillow库. 2.PIL库的简介: 1. PIL库主要有2个方面的功能: (1) 图像归档: ...

  5. iOS 封装SDK以及封装时bundle文件的处理

    这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...

  6. 小程序——阿里服务器配置https及什么是IIS

    1.申请域名:阿里云 2.免费开启SSL证书:管理=>免费开启SSL证书>单域名>dev.xxx.top 3.配置服务器:下载=>IIS7证书 *注册一个域名,可以免费开启一个 ...

  7. OpenStack-Storage(6)

    一. DAS/NAS/SAN 1.存储分类 (1)内置存储 (2)外挂存储 DAS (DirectAttached Storage):直连式存储 FAS (FabricAttached Storage ...

  8. redis简介与持久化

    一 . redis简介 redis属于NoSQL学名(not only sql) 特点: 存储结构与mysql这一种关系型数据库完全不同,nosql存储的是key value形式 nosql有很多产品 ...

  9. Maven基础:Maven环境搭建及基本使用(1)

    1. Maven环境搭建 1.1 Maven简介 1.2 Maven下载及环境设置 Maven下载地址:http://maven.apache.org/download.cgi 当前下载版本:apac ...

  10. Jekins相关笔记

    Jekins忘记密码操作 https://blog.csdn.net/intelrain/article/details/78749635 Jekins重启 https://www.cnblogs.c ...