C++day2

3 篇文章 0 订阅
本文介绍了C++11中引用、auto和decltype的关键概念。引用在初始化时实际操作的是其引用的对象,auto关键字在类型推断时会忽略顶层const,而decltype用于获取表达式的静态类型而不计算其值。文章还探讨了如何在使用decltype时处理引用类型以及const的层级问题,并通过示例解释了各种情况下的类型推断和初始化规则。
摘要由CSDN通过智能技术生成

1.使用引用其实就是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实就是引用对象的值。

2.auto一般会忽略掉顶层const,同时底层const则会保留下来。

const int ci=i,&cr=ci;
auto b=ci;//ci的顶层const被忽略掉了
auto c=cr;//c是一个整数
auto d=&ci;//d是一个指向常量的指针(对常量对象取地址是一种底层const)

如果需要保留下来顶层const,需要明确指出:

const auto e=ci;//保留顶层const
auto &g=ci;//g是一个整型常量引用,绑定到ci
auto &h=42;//错误,不能为非常量引用绑定字面值
const auto &j=42;//正确:可以为常量引用绑定字面值

3.希望从表达式的类型推断出要定义的变量的类型,但是并不想用该表达式的值初始化变量。为了满足这一要求,C++11新标准引入了decltype;

它的作用是返回操作数的数据类型,编译器分析表达式,并得到它的类型,却不计算表达式的值。

decltype(f()) sum =x;//sum的类型就是函数f的返回类型
const int ci=0,&cj=ci;
decltype(ci) x=0;//x的类型是const int 
decltype(cj) y=x;//y的类型是const int&,y绑定到变量x
decltype(cj) z;//错误:z是一个引用,必须初始化

有些表达式将向decltype返回一个引用类型,一般来说当这种情况发生时,意味着该表达式的结果对象能作为一条赋值语句的左值:

//decltype的结果可以是引用类型
int i=42,*p=&i,&r=i;
decltype(r+0) b;//正确:加法的结果是int,因此b是一个(未初始化的)int
decltype(*p) c;//错误,c是int&,必须初始化

r是一个引用,可以将r作为i表达式的一部分,如r+0,显然这个表达式的结果将是一个具体值,而非一个引用。

//decltype的表达式如果是加上了括号的变量,结果将是引用
decltype((i)) d;//错误:d是int&,必须初始化
decltype(i) e;//正确,e是一个未初始化的int变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值