Why decltype is required in C++11?

auto means "the variable's type is deduced from the initialiser."

decltype refers to a type in an arbitrary context.

Here's an example where you can't use auto:

template <typename T, typename U, typename V>
void madd(const T &t, const U &u, const V &v, decltype(t * u + v) &res)
{
  res = t * u + v;
}

There is no initialiser in the parameter declaration (and there can't be), so you can't use auto there.

The thing is, 99% of uses for decltype is in templates. There's no equivalent functionality for it there. In non-template code, auto is usually what you want to use.


While it is useful to get variables declared using auto, if you actually need to know the type of an expression, e.g., when producing a return type for a templatized function, auto isn't sufficient: you need to not just name a value but you need to get hold of type, e.g., to modify it. If anything could be dropped it would be auto. However, the use of decltype() tends to be a lot more wordy, i.e., auto is a nice short-cut.