effective morden c++1

条款一、模板型别推导

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也是按照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<被代理类型>()来转换。

你可能感兴趣的:(effective,morden,c++)