编程时常常需要把表达式的值赋给变量,这就要求在声明变量时清楚地知道表达式的类型。然而要做到这一点并非那么容易,有时甚至做不到。如下:
#include <string>
#include <map>
int main()
{
std::map<std::string, std::string> m{ { "apple", "苹果" },
{ "orange","橙子" },
{"pear","梨"} };
std::map<std::string, std::string>::iterator it = m.begin();
while (it != m.end())
{
//....
}
return 0;
}
std::map<std::string, std::string>::iterator 是一个类型,但是该类型太长了,特别容易写错
为了解决这个问题,C++11完善了auto类型。通过使用它,就能让编译器替我们去分析表达式所属的类型。
C++11中,标准委员会赋予了auto全新的含义:
auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此 auto 并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型
#include<typeinfo>
#include<iostream>
using namespace std;
int main() {
int x = 10;
auto a = 1,b = 5;//前后一致可以
auto c = 10,d = 1.0;//这样会报错,因为c和d的初始化表达式类型不同
return 0;
}
auto有不能被推导的情况:
void add(auto a, auto b){
//这样不能通过编译!!!
}
void TestAuto()
{
int a[] = {1,2,3};
auto b[] = {4,5,6};//这样会报错!!!
}
#include<iostream>
using namespace std;
auto func(){
//...
if(){
//...
return a;
}
else if(){
//...
if(){
//...
return b;
}
//...
return c;
}
//...
}
int main() {
auto add = func();
}
像这样多上几个嵌套,就不好确认数据类型,让代码可读性大打折扣!!!