1.首先这是一个关键字,这是C++ 语法决定的! auto这个关键字其实在很早的 c++版本就有了,好像是c++98 ,那时的功能很简单,就是表示一个变量的自动生命周期,中间版本又去掉了,但c++11以重新开放出来了,作用已经完全不同了,(你可以理解成字是一样,要表达的功能完全不一样了) 并且重新定义了其功能,变得更强大了!
作用:编译器推导变量的数据类型!
auto的自动类型推断发生在编译期 ! 这个很重要,圈起来!
为什么要引入引功能?
C++11 应该是参考了其实一些语言的特性如C#,python,java script ,可能就是感觉别的语言这个功能感觉很爽,
自己是不是也得整一下,不然不太low了!
其它语言这样: var testval=90;
比如我们现在经常使用:定义一个临时变量
auto abc =6;
auto test=func();
auto使用限制
1.不能作为函数参数
2.不能用于静态成员变量
3.不能用来定义数组
4.不能用来声明或定义为模板参数
5.不能用于sizeof/typeid操作
6.auto变量 推导类型前后必须一致,比如你定义推导整型, 就是使用后,不要一会推整型,一会又推浮点型,这
是不支持的!
7. auto不能与其他类型组合连用
如:auto int abc =5; 这样肯定不行
auto 使用场景:
1.
before:
std::vector<int> vs;
std::vector<int> ::iterator it ;
for (it = vs.begin(); it != vs.end(); it++)
{
//..
}
auto:
std::vector<int> vs;
for (auto i = vs.begin(); i != vs.end(); i++)
{
//..
}
这样写是不是简便很多,当然使用forearch就更简便了!
2.
在定义模板函数时,用于声明依赖模板参数的变量类型。
template <typename _Tx,typename _Ty>
void Add(_Tx x, _Ty y)
{
auto sum = x+y;
}
3.
模板函数依赖于模板参数的返回值
template <typename _Tx, typename _Ty>
auto Add(_Tx x, _Ty y)->decltype(x+y)
{
return x+y;
}
c++ 14已经支持下面这样写了,可以去掉 ->decltype(x+y) c++ 11必须要 decltype
template <typename _Tx, typename _Ty>
auto Add(_Tx x, _Ty y)
{
return x+y;
}
说明一下: 只能说c++11在这个功能上还不是特别强,当模板函数的返回值依赖于模板的参数时,我们无法在编译代码前确定模板参数的类型,所以无法得知返回值的类型,所以c++ 11 又想出了一招,在后面加decltype操作符,
decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,通过decltype(x+y)这个延迟推导,auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(_Tx+_Ty), 当然c++14 又做了优化了,这里就不作多介绍,假如你使用的编辑器支持更高的c++标准,你也可以采用c++14这样写,更简单直观!
使用时注意事项
1、使用auto关键字的变量必须有初始值。
2.对于数组类型,auto关键字会推导为指针类型,除非被声明为引用。例如:
int a[10];
auto b = a;
cout << typeid(b).name() << endl; // 输出:int *
auto &c = a;
cout << typeid(c).name() << endl; // 输出:int [10]
3.auto 型变量不跟随引用类型,除非你显式声明才跟随
int itest = 100;
int &r = itest;
auto autoetst = r;
a = 130; // 重新赋值
// 输出itest =100,autoetst =130
cout << "itest = " << itest << " autoetst = " << autoetst << endl;
// 显式声明
auto &rb = r;
rb = 15; // 重新赋值
cout << "itest = " << itest << "rb = " << rb << endl; // 输出itest=15,rb=15
4.auto 型变量不跟随const类型,除非你显式声明才跟随
const int c1 = 10;
auto c2 = c1;
c2 = 14; // 正确,c2为int类型,可以修改它的值
// 显示声明
const auto c3 = c1;
c3 = 15; // 报错,c3为const int类型,无法修改const变量