Différence entre les std::result_of et decltype

J'ai du mal à comprendre le besoin de std::result_of dans C++0x. Si j'ai bien compris, result_of est utilisé pour obtenir le type résultant de l'appel d'une fonction de l'objet avec certains types de paramètres. Par exemple:

template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
    return f(a);
}

Je ne vois pas vraiment la différence avec le code suivant:

template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
    return f(a);
}

ou

template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
    return f(a);
}

Le seul problème que je peux voir avec ces deux solutions, c'est que nous avons besoin de:

  • avons une instance de functor pour l'utiliser dans l'expression passée à decltype.
  • savoir un constructeur défini pour le foncteur.

Suis-je en droit de penser que la seule différence entre decltype et result_of c'est que le premier a besoin d'une expression, alors que le second ne l'est pas?