auto有简化声明的作用
那肯定时为了简化啊。简单说说auto在实际编程中的简化场景:
- auto对于大多数情况来说特别有用,如范围for
std::vector<double> dvec{1,2,3,4,5,6,7};
for(auto r:dvec) std::cout<<r<<" ";
- 在泛型编程声明往往比较复杂,如声明一个容器的迭代器不用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%的字符,大大提高了程序的简洁性。
- 复杂声明自动推断 如返回一个比较复杂的函数指针时,也可以使用到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 &);//简化返回值为函数的声明