Ich habe mit variadischen Vorlagen gespielt und folgendes bemerkt.Warum überschreitet diese die maximale rekursive Vorlagentiefe?
Dies funktioniert:
auto t = std::make_tuple(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
Dadurch wird der Fehler (: Clang 3.4) hat eine maximale Tiefe von 256 standardmäßig gcc 4.8.2 (edit): geben
auto t2 = std::make_tuple(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
jedoch Das Erstellen des Tupels direkt wird funktionieren:
std::tuple<int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int> t3(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
Ich bemerkte dies beim Versuch, eine Vorlagenfunktion zu erstellen, die eine Vorlagenklasse zurückgibt.
template <typename...Arguments>
struct Testing {
std::tuple<Arguments...> t;
Testing(Arguments...args) : t(args...) {}
};
template <typename... Arguments>
Testing<Arguments...> create(Arguments... args) {
return Testing<Arguments...>(args...);
}
In diesem Fall wird diese Arbeit:
auto t4 = create(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
und diese werden nicht:
auto t5 = create(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);
Wahrscheinlich, weil 'create' eine„rekursive Template“ist und wenn Sie es 17 Argumente geben braucht es eine Tiefe von 17, und wenn Sie es 16 Argumente geben, benötigt es eine Tiefe von 16, und das Limit ist (appertly) 16. –
g ++ 4.8.2 benötigt eine Instantiierungstiefe von genau 231, um 'make_tuple' mit 17 Argumenten zu kompilieren. [Live-Beispiel] (http: //coliru.stacked-crooked.com/a/67d4b91e9980f2f8) Das 'make_tuple' selbst fügt nur eine Instantiierungstiefe hinzu, so weit ich sehen kann, das Problem ist wahrscheinlich' tuple' selbst. – dyp
ooooooh, das erklärt meine Verwirrung –