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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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 家用空调常用塑料材料及用途