tipo de retorno final utilizando decltype con una función de plantilla variadic

Quiero escribir un sumador simple (para risitas) que sume todos los argumentos y devuelva una suma con el tipo apropiado. Actualmente, tengo esto:

#include <iostream>
using namespace std;

template <class T>
T sum(const T& in)
{
   return in;
}

template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
   return t + sum(p...);
}

int main()
{
   cout << sum(5, 10.0, 22.2) << endl;
}

En GCC 4.5.1 esto parece funcionar bien para 2 argumentos, p. sum (2, 5.5) devuelve con 7.5. Sin embargo, con más argumentos que este, obtengo errores de que sum () simplemente aún no está definido. Sin embargo, si declaro sum () así:

template <class T, class P...>
T sum(const T& t, const P&... p);

Entonces funciona para cualquier número de argumentos, pero sum (2, 5.5) devolvería el entero 7, que no es lo que esperaría. Con más de dos argumentos, supongo que decltype () tendría que hacer algún tipo de recursión para poder deducir el tipo de t + sum (p ...). ¿Es esto legal C ++ 0x? ¿o decltype () solo funciona con declaraciones no variables? Si ese es el caso, ¿cómo escribirías tal función?

Respuestas a la pregunta(5)

Su respuesta a la pregunta