如何看待在C++开发中频繁使用auto?
我在评审代码的时候经常发现声明变量时过度使用 auto 的问题。
我推荐的使用 auto 的原则是:当你不在乎变量的类型时(特别在泛型代码中),或者变量的类型跟表达式本身存在重复时,就使用 auto;反之,当你会关心变量的类型而其类型又不显然时,则明确写出变量类型。下面是一些适合用 auto 的例子:
auto it = v.begin(); // 迭代器的具体类型通常不关心
auto ptr = make_unique<Shape>(); // 通过表达式易判断类型;避免重复
auto res = reinterpret_cast<uintptr_t>(ptr); // 转型的结果类型不再重复
下面则是个非常可商榷的例子:
auto pos = GetPos();
不熟悉代码的人不会知道 pos 的类型是什么。不管实际类型是
pair<int, int>,
array<double, 3>,
还是 Coord,
写出来费不了多大力气,却能帮助读者。如果是 Coord,别人也能更快地找到定义,包括在编辑器里的跳转,或者在浏览器界面的搜索。
代码只需要写一次,但会被阅读很多次。这个读者可能是你自己。很多人在纠结 IDE 能自动提示类型这个问题。问题在于,你只在 IDE 里看代码吗?此外,在大项目里,正确跳转和类型推理往往不能正确工作,因为没有单个的让 IDE 理解的配置文件。
我个人看代码的地方经常会是浏览器(特别是代码评审)、Vim(个人偏好,配好了跳转可以非常准)、bat,有时甚至是最土的 cat/less。
读代码不累,比写代码不累更重要。让脑子休息,而不是让手指休息。我说用 auto 的场合,也是会让读代码的人更舒服的做法,因为更简洁、不重复。
附:C++ 核心指南对于什么时候不该用 auto 说得较少,但至少说了什么时候该用:
ES.11: Use auto to avoid redundant repetition of type names
Reason
Simple repetition is tedious and error-prone.
When you use auto, the name of the declared entity is in a fixed position in the declaration, increasing readability.
In a function template declaration the return type can be a member type.
最重要的仍然是避免重复。