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推导出你想要的类型