c++c++11autodecltype

Why decltype is required in C++11?


I am learning decltype in C++ 11.

The function of auto and decltype seems duplicated and I don't understand why we need decltype.

According to wiki, Its primary intended use is in generic programming, where it is often difficult, or even impossible, to express types that depend on template parameters.

In generic programming, I can use auto when it is difficult to express types:

template <typename T>
void MakeAnObject (const T& builder)
{
    auto val = builder.MakeObject();
    // do stuff with val
}

I don't understand why decltype is required.

Can decltype do something which auto can not?


Solution

  • 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.