随着程序越来越复杂有时侯根本搞不清到底需要的类型是什么程序员不得不回过头去从程序的上下文中寻求帮助。但 auto类型说明符能让编译器通过初始值来推算变量的类型。显然auto定义的变量必须有初始值。使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型所以该语句中所有变量的初始基本数据类型都必须一样auto i 0, *p i; //i是整数p是整型指针特别的当引用被用作初始值时真正参与初始化的其实是引用对象的值因为使用引用其实是使用引用的对象。此时编译器以引用对象的类型作为auto的类型int i 0, r i; auto a r; //a是一个整数r是i的别名而i是一个整数其次auto一般会忽略掉顶层const同时底层const则会保留下来const int cii, crci; auto bci; //int变量ci的顶层const被忽略 auto ccr; //int变量 auto di; //指向int变量的指针 auto eci; //指向int常量的指针对常量对象取地址是一种底层const auto gci; //int型常量引用先简单介绍一下常量引用auto gci; auto h42; //非法不能为非常量引用绑定字面值 const auto j42 //合法可以为常量引用绑定字面值常量引用的const是底层const其引用的对象值为常量。为什么写 auto g ci; 推导之后const却留下来了答顶层const只有拷贝初始化的时候才会被auto丢弃auto k ci; // 拷贝语义复制ci的值生成独立新变量k顶层const作用对象只是旧变量ci //所以k不需要继承这个constk的类型为int而 auto g ci; 是引用绑定并非拷贝引用不会复制出新数据g直接绑定ci对应的那块内存。此时限制“这块内存的值不能改动”的const身份发生了视角切换站在 ci 本身的角度const约束ci自己属于顶层const站在引用g的视角g访问的是下层被绑定的数据这个const就转变为底层const用来约束引用指向的内容不可修改。auto推导引用的时候会保留底层const因此最终 g 得到 const int 。如果希望推断出的auto类型是一个顶层const需要明确指出const auto f ci; //int常量切记符号和*只从属于某个声明符而非基本数据类型的一部分因此初始值必须是同一个类型auto kci,li; //k是整数l是整数引用 auto mci,*pci; //m是对整型常量的引用p是指向整型常量的指针 auto ni,*p2ci; //非法 i的类型是int而ci的类型是const int