1. auto类型推导与模板类型推导的相同点
template<class T>
void func(ParamType param);
func(expr);
Type x = expr;
Type类型在包含auto的时候,本质上Type和ParamType是一样一样的,而auto就对应着模板类型T。
由上一小节可以推断出:
//auto&在识别类型的时候,auto为等号右边对象的类型去掉&;
const int y = 1;
const int& z = y;
auto& x = y; //x为const int&,auto为const int;
auto& x = z; //x为const int&,auto为const int;
//auto&&在识别类型的时候,符合引用折叠类型
int y = 10;
auto&& x = y; //x为int&, auto为int&;
auto&& x = 27; //x为int&&, auto为int&&;
//same as array,func
2. auto类型推导与模板类型推导的不同点
使用括号表达式来赋值的时候,auto推导与模板推导表现不同
- 赋值表达式的几种方式:
int x = 10;
int x(10); //区分于函数声明,括号内为常量;
int x = {10};
int x{10};
不同点:
使用括号赋值法(包含大括号和小括号)表现行为不同:模板类型参数无法识别括号赋值法;auto会识别类型为std::initializer_list<int>
auto能识别的要求也是括号内的变量类型是一致的。(毕竟std::initializer_list是一个模板类型)C++14的不同点
C++14引用了auto可以作为普通函数的返回值,也可以作为lamdba表达式的函数形参,此时的auto类型推导是和模板类型推导完全一致的:无法识别括号表达式初始化;