C++ auto和decltype类型说明符

摘要

C++ auto和decltype类型说明符


一句话笔记

有时候我们定义带初始值的变量时,不知道或难以确定表达式的类型,我们可以用auto或decltype类型说明符,让编译器根据表达式自动推断变量的类型。例如,我们不知道或难以确定val1和val2的类型,或者不知道它有没有重新定义加法,使得结果类型改变,我们可以这样:

auto item = val1 + val2; //item的类型由编译器确定,编译器根据val1和val2相加的结果确定类型。

想要用好auto和decltype的便利,就要弄清楚编译器是怎么自动推断类型的,有哪些注意事项:

//当引用被作为auto变量初始值时,编译器将auto推断为所引用对象的类型。
int i = 0;
int &r = i;
auto a = r; // a的类型为int

//auto 一般忽略顶层(top-level)const,保留底层(low-level)const
const int ci = i;
const int &cr = ci;
auto b = ci;	// 相当于 "int b = ci;" (忽略了top-level const)
auto c = cr;	// 相当于"int c = cr;"
auto d = &i;	// 相当于"int *d = &i;"
auto e = &ci;	// 相当于"const int *e = &ci;",e的值可修改,但所指向内容为const的不可修改(保留了low-level const)
//auto 用于引用时不忽略顶层(top-level)const
auto &rf = ci;	// 相当于"const int &rf = ci;",其实rf是ci别名,如果忽略了const的话,也讲不通

//decltype处理顶层const和引用的方式与auto不同
decltype(ci) x = 0;	// 相当于 const int x = 0;
decltype(cr) y = x;	// 相当于 const int &y = x;

//如果decltype括号里是表达式,那么返回表达式结果对应的类型
int i = 42;
int *p = &i;
int &r = i;
decltype(r) b = i;		// 相当于 int &b = i; r是个引用
decltype(r+0) c = i;	// 相当于 int c = i; r与0相加结果是个具体值,不是引用
decltype(*p) d = i;		// 相当于 int &d = i; 由于*是解引用,所以*p是一个引用类型

NOTE:

  • 顶层(top-level)const,保留底层(low-level)const见这里《C++ prime 第五版》p57
  • 常量引用见这里《C++ prime 第五版》p55

经常使用的场合

  • for loop
for(auto item : v){
	;
}

相关知识点

相关/参考链接

《C++ prime 第五版》p61
《C++ prime 第五版》p62
https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值