> is x an iterator (Collection is std::map) or a number (Collection is std::string)? Here it is better to write out the iterator type if that's what you mean.
The reader would be able to infer this from context (as is the compiler, so it's still type-safe).
> `first` has type T except when T is bool. Gross. Better to write out the type T.
That's a preexisting problem with `vector<bool>` much more than it is with `auto`.