#auto
auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配类型,类似的关键字还有“dectype”(以一个普通的表达式作为参数,auto必须在定义时初始化,必须为同一推导类型
1、代替声明冗长的复杂变量
std::vector<std::string> vec;
for(auto i = vec.begin(), i != vec.end(), ++i)
{……}
2、在定义模板函数时,用于声明依赖模板函数的变量类型
template<_typename _Tx, _typename _Ty>
{
auto v = x * y;
std::cout<<v<<endl;
}
3、模板函数依赖模板的返回值
auto multipy(_Tx x, _Ty y)->decltype(x * y)
return x * y;
当模板函数的返回值依赖于模板的参数时,我们无法在编译代码前确定模板参数的类型,所以无法知道返回值的类型,这时我们可以使用auto,格式如上所示。
decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它的问题。
auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(_Tx*_Ty)。为何要将返回值后置呢?如果没有后置,则函数声明时为:
decltype(x*y)multiply(_Tx x, _Ty y)
注意事项:
1、auto a = 10,b = 20,c = ‘a’;此时会出现错误,在初始化时必须统一推导类型
2、若初始化表达式是引用,则去除引用
int a = 10;
int &b = 20;
auto c = b; //c此时为int型,会去除&
auto &d = b; //此时d为int&
3、如果初始化表达式为 const 或者 volatile ,同样去除
const int a = 10;
auto b = a; //此时b类型为int ,const被去除
const auto c = a;// 此时c类型为const int型
若关键字带&则不去除const语义
auto &d = a; //&只能进行访问不能进行修改a
4、初始化表达式为数组时,auto推到类型为指针
int arr[3] = {1, 2, 3};
auto brr = arr; //brr 类型为int*
5、表达式为数组,且auto带&时,推导类型为数组
int ar[3] = {1, 2, 3};
auto &br = ar; //br = ar[3];
6、函数或模板参数不能被声明为auto
void fun(void a) //error
7、auto并不是一个真正的类型,它仅仅是一个占位符,不能使用一些类型为操作数的操作符,如sizeof或typeid等
如:sizeof(auto)等是错误的用法