C++基础 auto 和 decltype的区别

auto关键字

auto 关键字允许编译器根据初始化表达式自动推导出变量的类型。这意味着你不需要显式写出变量的类型,编译器会根据你赋予的初始值来确定类型。这对于复杂类型、模板编程或是避免重复冗长的类型名称尤其有用,可以提高代码的可读性和编写效率。
简单的使用示例如下,可以简化迭代器的写法:

std::vector<int> p{ 1,2, 3, 4, 5 };
auto it = p.begin();	// auto 推导出 std::vector<int>::iterator
while (it != p.end()) {
	std::cout << *it << ' ';
	it++;
}

decltype关键字

decltype 则用于推断一个表达式的结果类型,而不是像 auto 那样推断一个初始化值的类型,同时与sizeof运算符类似,它不计算表达式的值,只分析表达式来确定其类型,下面是一个简单的使用示例,和上面的auto示例代码有着相同的效果:

std::vector<int> p{ 1,2, 3, 4, 5 };
decltype(p.begin()) it = p.begin();   
while (it != p.end()) {
	std::cout << *it << ' ';
	it++;
}

同时,decltype可以很方便的计算出某个表达式的返回类型,如下:

int f() {
	return 1;
}

decltype(f() + 1 + 2.11) p;		// p的类型被推到为double

auto 和 decltype的区别

从上面的例子看来,auto和decltype貌似差不多。接下来我们着重于两者不同的地方,对于auto关键字来说,是没有办法保留变量的顶层const和引用属性的,如果想要推导出引用或者const,必须手动写出,如下例:

const int i = 1;
auto p = i;				// p 推导为int
const int& pi = i;
auto p2 = pi;			// p2 推导为int
	
const auto p3 = i;		// p3推导为 const int
const auto& p4 = pi;	// p4推导为 const int&

而对于decltype关键字而言,则可以推断出const和引用属性,见下例:

const int i = 0;
const int* const& p = &i;

auto p1 = p;			// p1 推导为 const int* 类型,顶层const属性和引用丢失
decltype(p) p2 = p;		// p2 推导为 const int* const& 类型

除此之外,decltype还可以将表达式用()包裹,此时decltype的推导就不单单是表达式所属实体的类型,而是会继续通过表达式来推断出值类别来判断引用属性,

decltype((i)) p = i;				// 因为i为一个左值,故p推导为 int&
decltype((i + 1)) p2 = 1;			// 因为i+1表达式为一个右值,故p推导为int
decltype((std::move(i))) p3 = 1;	// std::move的结果为将亡值,故p推导为int&&

所以,decltype(x) 是变量名的规则,而 decltype((x)) 是表达式的规则,井水不犯河水,参数如果是变量名,就返回其声明的类型;而参数是表达式,再根据表达式的值类型来判断是否保留引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值