int i=0, &r = i;
auto a=r; // a是一个整数(r是i的别名,而i是一个整数) int a
auto 一般会忽略掉顶层 const(参见 2.4.3节,第57页),同时底层 const 则会保留下来,比如当初始值是一个指向常量的指针时:
const int ci=i, &cr=ci;
auto b = ci; //b是一个整数(ci的顶层 const 特性被忽略掉了) int b
auto c = cr; //c是一个整数(cr是ci的别名,ci本身是一个顶层const) int c
auto d = &i; //d是一个整型指针(整数的地址就是指向整数的指针) int *d
auto e = &ci; //e是一个指向整数常量的指针(对常量对象取地址是一种底层 const) const int *e
如果希望推断出的auto类型是一个顶层const,需要明确指出:
const auto f=ci; // ci的推演类型是int,f是const int
还可以将引用的类型设为 auto,此时原来的初始化规则仍然适用:
auto &g=ci; //g是一个整型常量引用,绑定到ci
auto &h=42; //错误:不能为非常量引用绑定字面值
const auto &j= 42; //正确:可以为常量引用绑定字面值
设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留(//引用毕竟是别名,当然要一样)。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。
要在一条语句中定义多个变量,切记,符号 &
和 *
只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同一种类型:
auto k=ci,&l=i; //k是整数,1是整型引用
auto&m=ci,*p= &ci; // m是对整型常量的引用,p是指向整型常量的指针
//错误:i的类型是int而&ci的类型是 const int
auto &n=i,*p2 = &ci;
《C++ Primer》 P62
标签:ci,const,常量,int,auto,C++,引用,推断 From: https://www.cnblogs.com/huvjie/p/18415583