概念介绍
auto、decltype是C++11新增特性,主要是用来做类型推导。这个特性是C++11新增特性,但是这个功能,C++编译器之前就具备,只是未对开发者开放使用。
通过这个例子可以证明:
string str;
int i = str;
vs编译的时候报错信息:
通过这个报错信息,可以说明,编译器在编译的时候,是能够推断出变量的类型的,不然通过 int i = str
这一行代码是不能推断出类型不匹配的。
由此可见,类型推导的功能,C++11之前就有。那为什么C++11之后开放出来了,那是因为:好用。是真的好用,希望大家以后多实践,越用越能够体会这个特性带来的便捷。
auto的用法
例子1: 使用迭代器遍历容器
C++11之前的写法:
vector<int> vec;
//do something
for(vector<int>::iterator itor=vec.begin();itor!=vec.end();itor++){
cout<<(*itor)<<endl;
//do something
}
使用auto:
vector<int> vec;
//do something
for(auto data : vec){
cout<<data<<endl;
//do something
}
上述写法中,auto data : vec
这样是对vec的元素进行拷贝,这样操作,当容器里面的元素较多,操作比较频繁时,会降低程序的运行效率,而且,如果需要修改vec的元素,这样遍历容器去修改也是不能修改容器本身的,只能修改拷贝的备份,失去了修改的意义。
所以,
如果需要修改容器的元素,建议这样写:
for (auto& data : vec){
cout<<data<<endl;
//do something
}
如果不需要修改容器的元素,建议这样写:
for (const auto& data : vec){
cout<<data<<endl;
//do something
}
这两种是通过引用的方式,避免遍历的时候需要去拷贝元素。如果不需要修改容器的元素,可以加上const,防止误操作。
例子2: 方便扩展、修改
int a;
//do something
auto b = a;
//do something
auto c= a++;
如果有一天,需要把a的类型换成long, 那么直接将int a;
改成 long a;
即可。
auto注意事项
1,不能这样写:
auto i;
2,可以在一条语句声明多个变量,但这多个变量只能是同一个基本数据类型
auto a = 0, *p = &a; //正确
auto b = 0, f = 5.01; //错误
decltype的用法
例子1: 使用变量的类型来定义一个新的变量
int i = 1;
decltype(i) a = 0;
例子2: 使用函数的返回值的类型来定义一个新的变量
如下,如果我们知道函数的返回值是一个指针,我们不需要知道具体是什么类型的指针,就可以定义一个变量接收函数的返回值:
decltype(f()) a = f();
注意:这里的decltype(f())
是不会执行函数f(),只推导函数的返回类型。
auto、decltype的区别
auto会忽略变量顶层的const、&属性,也就是说,一个变量如果是const int类型的,那么,如果用auto推导之后获取的变量类型则会是int。同样,&(引用)属性也会被忽略,如,int &,用auto推导之后就会变成int类型,但decltype不会这样:
const int ci = 42, &cj = ci;
decltype(ci) x = 0; //变量x的类型是const int
auto z = ci; //变量z的类型是int
decltype (cj) y = x; //变量y的类型是const int&
auto w = cj; //变量w的类型是int