目录
1. auto的作用:
auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。从这个意义上讲,auto并非一种“类型”声明,而是一个类型声明时的“占位符”,编译器在编译时期会将auto替换为变量实际的类型。
2. auto使用时的注意点
<1>. 使用auto定义变量时,必须初始化
<2>. VS不支持在函数参数列表中使用auto,QT中支持
<3>. auto变量不能作为自定义类型的成员变量
struct TEST
{
int a;
auto b; //错误,编译不过
auto c = 10; //错误,哪怕初始化了也编译不过
};
<4>. auto不能用于数组
auto a[3] = {1, 2, 3}; //错误,哪怕初始化也编译不过
<5>. 模板实例化对象的类型不能是 auto类型
vector<int> a = {1, 2, 3}; //可以
vector<auto> b = {1, 2, 3}; //错误,哪怕初始化了也编译不过
3. decltype 的作用
decltype实际上有点像auto的反函数, auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到其类型。根据decltype获得的类型,可以定义新的该类型变量
int i;
decltype(i) j = 0;
cout << typeid(j).name() << endl; // 打印出"i", g++表示integer
float a;
double b;
decltype(a + b) c;
cout << typeid(c).name() << endl; // 打印出"d", g++表示double
vector<int> vec;
typedef decltype(vec.begin()) vectype; // decltype(vec.begin()) 改名为 vectype
vectype k;
//decltype(vec.begin()) k;
for (k = vec.begin(); k < vec.end(); k++)
{
// 做一些事情
}
可以使用 typeid(a).name()来显示变量a的型别;
4. auto和decltype配合使用,实现追踪返回类型
追踪返回类型用于函数模板中,根据函数运算结果推导函数返回值类型。
在泛型编程中,函数中参数的型别不定,如果函数返回值型别是函数参数运算后得到,那会导致函数的返回值型别不定,无法在函数声明时指定函数返回值。所以,使用auto和decltype来实现追踪返回类型;在函数名和参数列表后面指定返回类型;
template <typename T1, typename T2>
auto func( T1& t1, T2& t2) -> decltype( t1*t2 )
{
return t1*t2;
}