auto

modern c++ 新的关键字

auto类型推导,先说好处。

int x;    这个语句有潜在的未初始化风险。

auto所修饰的变量必须被初始化,当我们使用auto时,一系列由未初始化的变量带来的问题就ヾ(ToT)Bye~Bye~了。

另一个作用就是将啰嗦的变量声明简化,有人会说类型不直观,要直观首先保证你的代码在使用显式声明的前提下更清晰,可维护性更高,并且没有写错。比如

std::vector<int> v;
...

//想要获取v的大小,你可能使用过下列语句
unsigned sz = v.size();

标准规定v.size()的返回类型应该为std::vector<int>::size_type,而规定中仅仅是规定了一个无符号的整型,但是64位Windows系统中是64位(8字节),unsigned是32位(4字节),显然是有风险的。

std::unordered_map<std::string, int> m;
...

for(const std::pair<std::string, int>& p : m)
{
    ...        //在p上实施某些操作
}

看起来合情合理,实则暗藏杀机。请记住std::unordered_map的键值部分是const,所以std::pair的类型并不是std::pair<std::string, int>,而是std::pair<const std::string, int>。编译可能是成功的,但是编译器对m中的每个对象都做了一次复制,然后把P这个引用绑定到该临时对象。每次迭代结束后,该临时对象都会被析构一次。效率可想而知了。

但是你使用auto就可以解决这个问题,不必担心声明变量的类型和它初始化表达式的类型之间不匹配了。

auto 变量必须初始化,基本上对会导致兼容性和效率问题的类型不匹配现象免疫,还可以简化重构流程,通常也比显式指定类型要少打一些代码。

当然有些时候auto推导出的类型可能是错误的,常见的“隐形”的代理类型,代理类比较难发现。

用带显式类型的初始化物习惯用法强制auto推导出你想要的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值