auto
int x; // oops, uninitialised
auto
rather than unsigned
to
capture the result of vector::size avoids type conversions that in turn may introduce errors.
Sometimes using the exact type of some expression introduces errors. In the case of auto b =
getVecOfBool()[i];
, b
is not a bool, it’s some object which contains a reference back to the
vector. If the vector goes out of scope before we read from b
, then we’ll encounter UB.
Libraries that rely on expression templates (I think Eigen does this) also do not interact well with
auto
- they need types to be mentioned explicitly in order to concretise/evaluate the expression.
The solution: put the type on the RHS. Meyers suggests using static_cast
but that looks pretty
ugly. A decent alternative from Herb Sutter’s blog post on Almost Always Auto is just to do
auto x = MyType { some.complex.expression() };
Putting the type on the RHS is preferable to the LHS, because you can still use auto
to force
initialisation, and it looks more uniform/consistent.