auto 和 decltype的区别

auto和decltype都是类型推断的两种方式,但之间又有区别。

主要有这几个方面的区别:

1.auto是通过编译器计算变量的初始值来推断类型的,decltype同样也是通过编译器来分析表达式进而得到它的类型,但是它不用将表达式的值计算出来。

2.编译器推断出来的auto类型有可能和初始值类型不同,比如对于顶层const,auto会忽略顶层const性质,但是decltype是保留下来的,这在下面的代码中会有所体现。

3.与auto不一样,decltype的结果类型与表达式形式有密切关系。比如decltype()内层没有括号,那么得到的类型就是变量的类型,如果有多层括号decltype(())那么返回的就是引用,具体可以通过代码分析。

#include <iostream>
#include "Sales_item.h"
int main()
{
	int i = 4,&p =i;
	auto a = i;//相当于int a=i;
	decltype (i) b = i;//编译器推断i是一个int,相当于int b=i;
	decltype ((i)) c = i;//只要出现了表达式那么decltype就推断出是引用
						 //相当于int &c = i;
	decltype(p) q = i;//即int &q = i;
	decltype(p + 0) r = i;//表达式的结果是int型 即int r =i;
	std::cout << i << " " << a << " " << b <<" "<< r << std::endl;
	c++;
	std::cout << i << std::endl;
	q++;
	std::cout << i << std::endl;


	const int m = 10;
	auto d = m;//由于auto会失去顶层const的性质,即int d=m;
	d++;//合法,d是整数
	decltype (m) e = 11;//相反decltype 会保留const性质,即const int e=11;
	e++;//该句非法操作 e是常量
	decltype((m))f = d;//即const int &f=d;
	int g = 12;
	f = g;//该句非法操作,是因为f是常量引用
	

	system("pause");
	return 0;
}

执行第一段代码的打印结果:



当然对于decltype和auto还有其他值得注意的地方,平常基本上会用不到就不再总结了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值