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> ---->这里的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<被代理类型>()来转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值