auto和decltype区别和联系

auto有简化声明的作用

那肯定时为了简化啊。简单说说auto在实际编程中的简化场景:

  1. auto对于大多数情况来说特别有用,如范围for
std::vector<double> dvec{1,2,3,4,5,6,7};
for(auto r:dvec) std::cout<<r<<" ";
  1. 在泛型编程声明往往比较复杂,如声明一个容器的迭代器不用auto来说应该是这样的:
std::vector<double> dvec{2,3,22,4,5,6};
std::vector<double>::iterator bIterWithoutAuto=dvec.begin();
auto bIterWithAuto = dvec.begin();

用auto代替迭代器声明少了接近86.22%的字符,大大提高了程序的简洁性。

  1. 复杂声明自动推断 如返回一个比较复杂的函数指针时,也可以使用到auto:
int fun(int i, int j)
{
    std::cout << i << " " << j << std::endl;
    return 44;
}
auto returnAFunPointer()
{
    return fun;
}

进入正题

auto和decltype推断上的不同:

关键字top-level/low-level属性引用表达式
auto只保留low-level引用实际类型表达式实际类型
decltype均保留引用多种情况
  • decltype对于一个解引用会推断为引用
  • 对于不加括号的变量,为变量本身;对于加上括号的,为引用;
  • decltype对于一个函数不会推断为指针,需要手动加上*,decltype(fun) *

关于auto的例子:

#include <iostream>

int main()
{
	const int* const ptr = new int;
	auto ptr2 = ptr;//top-level忽略,low-level保留。const int * ptr2=ptr1;
	
	int d=44;
	int &rd=d;//rd是引用类型
	auto ard=rd;//洞悉本质,直接声明为引用背后的类型
	auto &ard2 =rd;//体察民情,有声明就响应

	delete ptr;

}

关于decltype的例子:

int i=0;
int j=33;
decltype((i)) d=j;//小括号意味着声明一个对应引用
decltype(i) dd;//未初始化的int
std::size_type sumLength(const string &,const &string);
std::size_type lagerLength(const string &,const &string);//两个函数只是名字不一样
decltype(sumLength) * getFcn(const string &);//简化返回值为函数的声明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值