trailing Rückgabetyp mit decltype mit einer variadischen Template-Funktion

Ich möchte einen einfachen Addierer (für Kichern) schreiben, der jedes Argument addiert und eine Summe mit dem entsprechenden Typ zurückgibt. Derzeit habe ich Folgendes:

#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;
}

ei GCC 4.5.1 scheint dies für zwei Argumente, z. sum (2, 5.5) gibt mit 7.5 zurück. Mit mehr Argumenten als diesen erhalte ich jedoch Fehler, dass sum () einfach noch nicht definiert ist. Wenn ich sum () aber so deklariere:

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

Dann funktioniert es für eine beliebige Anzahl von Argumenten, aber Summe (2, 5.5) würde Ganzzahl 7 zurückgeben, was nicht das ist, was ich erwarten würde. Mit mehr als zwei Argumenten gehe ich davon aus, dass decltype () eine Art Rekursion durchführen müsste, um den Typ von t + sum (p ...) ableiten zu können. Ist das legal C ++ 0x? oder funktioniert decltype () nur mit nicht variadischen deklarationen? Wenn dies der Fall ist, wie würden Sie eine solche Funktion schreiben?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage