C++11新特性之auto&decltype

本文介绍了C++11中引入的auto和decltype关键字,详细阐述了它们在类型推导中的作用和规则。auto用于简化变量定义,必须配合初始化,而decltype能获取表达式的类型,两者结合可用于返回类型后置的语法,提高了代码的简洁性和效率。
摘要由CSDN通过智能技术生成

C++11中引入了auto&decltype关键字实现类型推导,通过这两个字可以方便的获取复杂的类型还可以简化代码,提高编码效率。

auto关键字


auto类型推导

C++98/03中一直就有auto关键字了,只不过在C++98/03中auto关键字用于标识具有自动存储期的局部变量,它的作用并不大,在实际的编码过程中我们基本没有用过auto关键字,比如

auto int i = 0;  //在C++98/03中 它的定义和int i = 0;是一样一样的,因此通常为了方便我们都省略了auto关键字,与之相对应的是

static int i = 0; //标识i是一个静态类型,存储在堆的全局数据区。

在C++11中auto关键字被重新利用了,用作类型推导,比如通常我们定义一个变量:

int i = 0; //强类型定义 改用auto关键字的话就可以 auto i= 20;这样定义了,我们就不需要关系对于每个值定义成什么类型,编译器自动会去根据初始化表达式的值的类型去推导变量的具体类型,因此也就意味着,编译器要推导出变量的类型,那么该变量就必须初始化,否则会编译失败。

看下面auto的一些基本用法:

	auto x = 5;					//OK:x是int类型
	auto pi = new auto(1);		//OK:pi 是int *类型
	const auto *v = &x, u = 6;  //OK:V是const int *类型
	static auto y = 0.0;		//OK:y是double类型
	auto int r;					//error 无法通过编译
	auto s;						//error 无法通过编译

使用VC2013 IDE在main返回之前打个断点,可以再VC的local窗口看到变量的类型,如下:


因此,由上可知,auto不能代表一个实际的类型声明,如s编译错误,仅仅是用作类型声明的一个占位符,在编译期间,编译器会根据后面初始化值的具体类型替换auto占位符。


auto的推导规则

下面通过一组例子我们来看一下编译器在编译器间是如何推导出变量的具体类型的。
	int x = 0;    
	auto *a = &x;	//a的类型是int*,auto被推导为int
	auto b = &x;	//b的类型int*, auto被推导为int*	
	auto &c = x;	//c -> int的引用,auto被推导为int
	auto d = c;     //d -> int  auto被推导为int

	const auto e = x;   //e -> int auto 被推导为int
	auto f = e;			//f  -> int auto被推导为int	
	
	const auto & g = x; //g ->const int & 
	auto &h = g;        //h -> const int &



上面的例子可以看出。a,c的推导结果比较见到,b说明b不声明为指针也可以推导出b为指针类型,需要注意的是:
1、d的推导结果说明当表达式是一个引用类型的时候,auto会把引用类型抛弃,直接推导成原始类型int.
2、f的推导结果说明,当表达式是一个带cv限定符时,auto会把cv限定符也就是const抛弃,推导成non-cons
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值