条款一、模板型别推导
T的推断忽略const(指向目标不可变的const可以推断), volatile等,因为T只是一个副本而已
T& 推断出实际的类型左值/右值而非引用,并且不会把数组型[ ]推断成pinter类型(还可以推断出数组的元素数),或把函数推断成函数指针。
const T& 无特殊
T&&把左值推断成左值引用,右值推断成右值,即使得结果为左值/右值,而不是T。即传入X则T为X&,传入X&则T推断为X&,最终参数T&& == 【X& &&】折叠为X&(此为万能引用,仅有这种模板可以推断出引用)
传入X&&后T推断为X, T&& = X&&
条款二、auto型别推断
auto大多时候的推导规则与template一致
不同的是auto可以将{a,b,c}形式的序列推断成std::initializer_list<T> ---->这里的T也是按照template方式推断的
而template参数不可以接受初始化列表。
这种情况下,如果初始化列表中的类型不同如{string, int}则auto会推断出错
在作为返回值推断和lambda表达式的参数推断时均不能接受初始化列表{.....}
条款三、decltype
decltype(auto) 在c++14可以让返回值采用decltype规则进行推断
auto亦可以推断返回值,规则与template一致
decltype推断的就是名字的声明类型,对表达式则是表达式类型,左值表达式会被推断为左值引用,如return (x)则返回类型为x&。
条款四、查看型别推断结果
1、编译器的悬停信息
2、诊断信息
3、运行时识别
条款五、优先使用auto
(1)可以避免过长的名字
(2)防止错误的声明
(3)避免初始化风险
(4)修改类型时auto可以自动推导
(5)可以推断闭包的类型,c++14后还可以推断闭包的参数类型,并且闭包快于function对象,内存也小。
条款六、auto推断型别不符合要求时进行强制转换
auto面对代理对象时会推断出代理对象的类型,或者是临时对象的类型,但我们想要被代理的对象所以使用static_cast<被代理类型>()来转换。