义乌网站建设方案案例,工业设计专业是干嘛的,个人网站模板儿童,建筑工程网上办事大厅登录条款2#xff1a;理解auto类型推导
条款1中#xff0c;模板类型推导的函数模板形如#xff1a;
templatetypename T
void f(ParamType param);当变量采用auto声明时#xff0c;auto扮演了模板中的T这个角色#xff0c;而变量的类型扮演的是ParamType的角色。 条…条款2理解auto类型推导
条款1中模板类型推导的函数模板形如
templatetypename T
void f(ParamType param);当变量采用auto声明时auto扮演了模板中的T这个角色而变量的类型扮演的是ParamType的角色。 条款1中的三种情况同样也适用于auto只有下面的一点不同。
当用于auto声明变量的初始化表达式是使用大括号括起时推导所得的类型就属于std::initializer_list。但是如果向对应的模板传入一个同样的初始化表达式类型推导就会失败。
auto x {11, 23, 9}; // x的类型是std::initializer_listtemplatetypename T
void f(T param);f({11, 23, 9}); // error无法推导T的类型所以auto和模板类型推导真正的唯一区别在于auto会假定用大括号括起的初始化表达式代表一个std::initializer_list但模板类型推导却不会。
只有将param声明为std::initializer_listT模板类型推导机制会推导出T应有的类型。
templatetypename T
void f(std::initializer_listT initList);f({11, 23, 9}); // T的类型为intC14中允许使用auto来说明函数返回值需要推导lambda表达式中也会在形参声明中用到auto。然而这些auto用法是在使用模板类型推导而非auto类型推导。
auto createInitList()
{return {1, 2, 3}; // 错误无法为{1, 2, 3}完成类型推导
}