My personal rules for using auto. Only use it iff:
1. the actual type is clearly visible on the right hand side.
auto f = make_widget(); // it's a widget
auto i = 123; // it's an int
auto x = vec3(1.0, 0.0, 0.0); // it's a vector
2. the actual type doesn't really matter so much or is complicated to type out.
auto it = vec.begin(); // it's an iterator
auto it = // some template expression
1. the actual type is clearly visible on the right hand side. auto f = make_widget(); // it's a widget auto i = 123; // it's an int auto x = vec3(1.0, 0.0, 0.0); // it's a vector
2. the actual type doesn't really matter so much or is complicated to type out. auto it = vec.begin(); // it's an iterator auto it = // some template expression
3. the actual type is not known i.e. lambdas