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

posted @   double64  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-09-15 C# base 调用基类构造函数
2021-09-15 C# 属性
2021-09-15 C# 命名空间
2021-09-15 英语动词时态语态知识点详解
2021-09-15 英语八大时态
2021-09-15 家用空调常用塑料材料及用途
点击右上角即可分享
微信分享提示