auto与dacltype的使用
auto类型说明符
编程时常常需要把表达式的值赋给变量,这就要求早在明变量的时候清楚的知道表达式的类型。要做到这一点看似很容易,但是有时候却做不到。为了解决这一问题,C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些值对应一种特定类型标识符不同,auto让编译器通过初始值推算变量的类型。显然,auto定义的变量必须要有初始值:
auto iter ; //错误:编译器推断不出来iter的变量类型
auto iter = val1 + val2; //iter初始化为val1和val2相加的结果
使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样:
auto i = 0, *p = &i; //正确:i是整数,p是整型指针
auto sz = 0, pi = 3.14; //错误:sz和pi的类型不一致
复合类型、常量和auto
编译器推断出来的auto类型有时候和初始值的类型完全不一样,编译器会适当的改变结果类型使其更符合初始化规则。
const int ci = 0, &cr = ci;
auto b = ci; //b是一个整型
auto c = cr; //c是一个整型
auto d = &i; //d是一个整形指针
auto e = &ci; //e是一个指向整数常量的整形指针
decltype类型指示符
有时候会遇到这种情况:希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量。为了满足这一要求,C++11新标准引用了第二种类型说明符,decltype,它的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式的类型,却不实际计算表达式的值:
backtype f() {}
decltype(f()) sum = x; //sum的返回类型就是函数f()的返回类型
如果decltype使用的表达式是一个变量,则decltype返回该变量的类型:
const int ci = 0, &cj = ci;
decltype(ci) x = 0; //x的类型是const int
decltype(j) y = x; //y的类型是const int&,y绑定到变量x
decltype(cj) z; //错误:z是一个引用必须初始化
需要指出的是,引用从来都是作为其所指对象的同义词出现,只有在decltype处是个例外。
decltype和引用
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果所对应的数据类型:
backtype f() {}
decltype(f()) sum = x; //sum的返回类型就是函数f()的返回类型
int i = 32, *p = &i;
decltype(*p) c; //错误:表达式的内容是解引用操作,则decltype将得到引用类型,必须要初始化
还有就是,如果decltype所处理的变量名加上一对小括号,那么decltype就会得到引用类型:
decltype((i)) x; //错误:x的类型是int&,必须初始化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!