在C++11
发布之前,C++
定义变量必须指定变量的类型,不像拥有“类型自动推断”技术的语言,比如python。当C++11
发布后,C++
也拥有了“类型自动推断”技术,即auto
关键字和decltype
关键字。我们在这里描述auto
关键字的用法。
语法
//变量
1. auto variable initializer //从其初始化器自动推导变量类型
//函数
2. auto function -> return type //从尾随的返回类型推导,事实上这里的auto只是语法作用,并不进行自动类型检测。
3. auto function //从return语句推导
4. template <auto Parameter> (c++17)//类型由对应使用的参数推导
举例
#include <iostream>
template <class T,class U>
auto add(T t,U u) { return t+u; } //返回类型是operator+(T,U)的类型。
//目前vs2017还不支持
template <auto n>
auto f() -> std::pair<decltype(n),dcltype(n)>
{
return {n,n};
}
int main()
{
auto a=1+2; //a的类型是int
auto b=add(1,1.2); //b的类型是double
auto c={1,2}; //c的类型是std::initalizer_list<int>
auto d=f<1>)(); //结构化绑定声明 (vs2017不支持)
int &e=a;
auto g=e; //此时g的类型为int,而不是int&
const int h=100;
auto i=h; //i的类型为int,而不是const int(去除const)
const auto j=h; //j的类型此时为const int
//如果auto关键字带上&号,则不去除const语意
auto &k=h; //k的类型为const int
auto l[3]={1,2,3};
auto m=l; //m的类型为int*
//若表达式为数组且auto带上&,则推导类型为数组类型。
auto &n=l; //n的类型为int[3]
}
总结
auto
定义变量一定要进行初始化。- 如果初始化表达式是引用,则去除引用语义。
- 如果初始化表达式为
const
或volatile
(或者两者兼有),则除去const/volatile
语义。 - 初始化表达式为数组时,
auto
关键字推导类型为指针。 - 函数的参数不能使用
auto
,在不支持C++17
标准的编译器上模板参数也不能使用auto
。