C++ auto 类型推断注意的地方
int i=0, &r = i;
auto a=r;         // (int a) a是一个整数(r是i的别名,而i是一个整数) 
auto 一般会忽略掉顶层 const(参见 2.4.3节,第57页),同时底层 const 则会保留下来,比如当初始值是一个指向常量的指针时:
const int ci=i, &cr=ci; 
auto b = ci;      // (int b) b是一个整数(ci的顶层 const 特性被忽略掉了) 
auto c = cr;      // (int c) c是一个整数(cr是ci的别名,ci本身是一个顶层const) 
auto d = &i;      // (int *d) d是一个整型指针(整数的地址就是指向整数的指针)   
auto e = &ci;     // (const int *e) e是一个指向整数常量的指针(对常量对象取地址是一种底层 const) 
如果希望推断出的auto类型是一个顶层const,需要明确指出:
const auto f=ci;   // f是const int, ci的推演类型是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;    //(const int& m)m是对整型常量的引用,(const int *p)p是指向整型常量的指针
auto &n=i,*p2 = &ci;   //错误:i(int &i)的类型是int,(const int *p2) 而 &ci 的类型是 const int
// 上面错误是,前一个 auto 是 int, 后面又变成 const int 了,不是同一种类型,所以报错。
《C++ Primer》 P62
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号