类型别名、auto、decltype

1. 类型别名

1.1 使用方式

typedef double dou;
using pf = int(*)();

1.2 类型别名与常量、指针

使用类型别名时,常常认为是做简单的替换,在类型别名指代复合类型或常量时则可能产生认知错误;

例程中,pint指代int *,声明变量时如果简单替换,则得到 const pint cint1->const int* cint1,则cint1和cint2类型应当一致,但程序中注释语句会产生错误,指明这两个变量并不是相同类型,实际上,cint1是顶层const指针,而cint2是底层const指针;

const是对给定类型的修饰,因此const修饰pint时,修饰的是指针类型,cint1是指向int的常量指针;而替换后修饰的是int,cint2是指向const int的指针

int main() {
	using pint = int*;

	int ii = 0;

	const pint cint1 = ⅈ
	const int* cint2 = ⅈ

	*cint1 = 2;
	//*cint2 = 2;	//报错

	int ii1 = 2;
	//cint1 = &ii1;	//报错
	cint2 = &ii1;

	return 0;
}

2. auto

2.1 使用方式

auto根据初始值推断类型,因此不给初始值会报错;
auto不会推断引用类型,推断引用需要带上引用符号

int ii = 0;
//auto ii2;
auto& ref1 = ii;	//int&
auto ref2 = ref1;	//int

int* pii = ⅈ		
auto refp = pii;	//int*

auto&& ref3 = ii;	//int&
auto&& ref4 = 10;	//int&&
auto&& ref5 = ref3;	//int&
auto&& ref6 = ref4;	//int&

2.2 auto与常量

auto会保留底层const,忽略顶层const;
使用auto&时,顶层const则会保留

const int ii = 10;
auto ii1 = ii;	//int
auto& ref1 = ii;	//const int&

const int* const cptr = ⅈ
auto cptr1 = cptr;	//const int*
auto& refp = cptr;	//const int *const

int ii2;
cptr1 = &ii2;
//refp = &ii2;	//报错

3. decltype

3.1 使用方式

decltype可以推断操作数的类型;
decltype可以推断顶层const;
不同于auto,decltype可以直接推断引用,此时引用对象不再作为原对象的同义词;
ref+1是具体值,因此推断出int;
*p可以赋值,因此推断出int&;
变量加括号,推断出int&;

int ii = 10;
const int cii = 15;
int& ref = ii;
int* p = ⅈ

decltype(ii) ii1;			//int
decltype(cii) ii2 = 0;		//const int
decltype(ref) ref1 = ii;	//int&
decltype(ref + 1) ii3;		//int
decltype(p) ptr;			//int*
decltype(*p) ref2 = ii;		//int&
decltype((ii)) ref3 = ii;	//int&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值