条款五:优先选用auto,而非显式型别声明
auto的优点:
-
避免生成未初始化的变量;
-
省略冗长的变量类型的编写时间;
-
能够支持自动推导自己完全不知道类型的变量类型,例如lambda表达式;
-
方便进行代码平台切换,简化重构流程,自动转换类型;
-
避免由于类型不匹配导致兼容性和效率问题,例如隐式转换或者值拷贝操作产生的额外消耗;
auto的缺点:
-
auto的推导类型并不总是尽如人意,总会有些特例,参见条款二和条款六;
// 例外情况 {11,112} -> std::initializer_list<int> std::vecotr<bool>[] -> std::vector<bool>::reference // 返回代理型别而不是bool &
条款六:当auto推导的型别不符合要求时,使用带显示型别的初始化物习惯用法
C++中存在一种代理类,用于模拟或增广其他类,例如:
std::vector<bool>::reference
这种代理类会导致auto推导出“错误”的型别,对于这种情况,需要使用带显式型别的初始化物习惯用法强制auto推导出你想要的型别,也可以用来降低变量的精度。
std::vector<bool> features(4); // 带显式型别的初始化物习惯用法 auto a = static_cast<bool>(feature[2]); double d = 1.2; // 降低变量的精度 auto f = static_cast<float>(d);