C++ auto关键字
C++中有很多很长的类型,那么作为一个优秀的编程语言肯定会想办法便利程序员开发。在C语言中typedef给类型取别名,但是typedef还是有很多不足,比如我只用一次该类型,那么typedef重命名就有点多余了。C++11标准中将auto赋予新的含义,也可以完成这一功能。
auto关键字
C++11重新定义关键字auto的含义,使得auto能方便我们日常编写代码。
在早起C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
auto的使用细则
- auto声明的变量必须由编译器在编译时期推导可以得出的。
- 用auto声明指针类型时,用auto和auto* 没有任何区别,但用auto声明引用类型时则必须加&
- 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后推导出来的类型定义其他变量。
- auto不能作为函数的参数,可以做返回值,但是建议谨慎使用。
- auto不能直接用来声明数组
样例1:“auto”的符号必须具有初始值设定项
#include <iostream>
using namespace std;
int func1()
{
return 10;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = func1();
// 编译报错:error C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
//auto e;
cout << typeid(b).name() << endl; // int
cout << typeid(c).name() << endl; // char
cout << typeid(d).name() << endl; // int
}
样例2:auto和auto* 没有任何区别,但用auto声明引用类型时则必须加&
#include <iostream>
using namespace std;
int main()
{
int x = 10;
auto y = &x;
auto* z = &x;
auto& m = x;
cout << typeid(y).name() << endl; // int * __ptr64
cout << typeid(z).name() << endl; // int * __ptr64
cout << typeid(m).name() << endl; // int
return 0;
}
样例3:“auto”必须始终推导为同一类型、数组不能具有其中包含“auto”的元素类型
#include <iostream>
using namespace std;
int main()
{
auto aa = 1, bb = 2;
// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
//auto cc = 3, dd = 4.0;
// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
//auto array[] = { 1, 2, 3 };
return 0;
}
样例4:auto可以做函数的返回值但不能做参数类型 (不建议使用)
#include <iostream>
using namespace std;
auto func2(int x)
{
return x;
}
// 编译报错:error C3533: 参数不能为包含“auto”的类型
//auto func3(auto x = 10)
//{
// return x;
//}
int main()
{
return 0;
}
auto关键字使用场景
1. 代替长类型
上面都是一些auto来代替int之类的短类型,但是实际上我们并不这样做,一般情况下auto是用来代替长类型,便利开发人员的编码。
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<string, string> dict;
map<string, string>::iterator mit1 = dict.begin();
auto mit2 = dict.begin();
return 0;
}
如上申明一个map的迭代器,采用auto就非常简洁并且编码效率高。但是可读性就变差了。
2. 范围for中使用
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> lt = { 1,2,3,4,5 };
for (auto& k : lt)
{
cout << k << "->";
}
cout << endl;
return 0;
}
一般我们习惯在范围for中使用auto,省去我们自主判断类型的时间,但是依然降低了可读性。
auto关键字的缺点
- 降低代码可读性
- 不适用invisible proxy class(代理类)