The presence of 'auto' is becoming wide spread and is a really really bad practice.
This is a most interesting topic, and I think we are going to see all kinds of practices of this (when to use and when not to use).
There is the recommendation not to repeat yourself, but then there is the problem for the reader of the source code to understand what is going on.
I used to favor the second view (and explictely use the type). But then I programmed Go a lot, and there is a similar mechanism. Assignments can be done as usual with "int a = f()" just as in C/C++, but there is also the syntax "a := f()" where you don't have to declare the type of a. This is used consequently everywhere, and it is recognized as a strength of Go (while still having static type testing by the compiler).
So my personal opinion is that I like to use "auto" for all but the primitive types. And I want the IDE to help me see what the type is.
Edit: spelling and wording.
I tend to agree that this is going to be interesting and I'm sure we'll see a new Herb book about 10-20 ways to write better C++ in the next year related to all the fun things Cxx11 does to the language.
In the case of auto though, I agree overuse could be a problem but in general I don't agree with typedef everything. In code I was working on tonight I had something like the following:
std::vector< Item* > removals;
... do a loop adding to "removals" those items which need to be removed after iteration processing ...
In no other case do I need a vector of that type, it is purely local and very descriptive between what it is defined as and the name of the local it is stored in. Hmm, what could that mean other than, these are things to be removed.. So the end of the function is:
for( auto it : removals )
something.erase( it ); // It's a set, so no find required.
I find this to be both extremely readable and easily understood by others. Yes, it is a simple case, but the point is can you think of many ways to interpret a well named (ok, descriptively named, "well" named is questionable) variable with a locally given type that could be used in in a different context? If you can use it in a different context, does it still apply to the overall descriptive naming?
In the same code, I have a type "mPairs" which is a "PairMap_t", hopefully you already know what the typedef is.. :) So, using auto in this case:
auto it = mPairs.find( Pair( lhs, rhs ) );
Is still pretty readable? "Pair" in this case is a local class used to contain a bit more than the "lhs/rhs" items but the intention is still clear, find "that specific one" and give me an iterator to it. I "could" add the following: "typedef PairMap_t const_iterator PairConstIterator_t" or some such but what good does that do for readability? It doesn't do anything useful except waste typing really, if you bothered to look at the definition of "mPairs", you know exactly what 'it' is defined as. Seems pretty clean and descriptive to me.