Auto was a keyword that C++ "inherited" from C and had been around for a long time but was almost never used because there were only two possibilities: it wasn't allowed or it was assumed by default.
C++11 introduced the usage of auto to denote an inferred type.
Similarly to how template type deduction works for function templates, auto x = initializer deduces the type of x from the type of initializer.
Consider the following function template:
template<class T>
int whatever(T t) {
// point A
};
T has been allocated a type at point A based on the value supplied for whatever's argument.
When you execute auto x = initializer;, the type for x is deduced from the type of initializer that was used to initialize it.
This implies that for every compiler that attempted to implement C++98/03, much of the type deduction mechanisms needed to construct auto were already present and utilised for templates.
As a result, adding support for auto appears to have been rather simple for virtually all compiler teams—it was implemented rapidly, and there appear to have been few errors associated with it.