Während auf einem C++ 11-Typ eingestellten Arbeits habe ich versucht, diese Funktion zu implementieren (abgespeckte auf das Minimum):Warum schlägt der Rückgabetyp decltype für die rekursive Vorlage fehl, während die Rückgabetypableitung problemlos funktioniert?
constexpr auto test() -> bool;
template <typename T, typename... Rest>
constexpr auto test() -> decltype(test<Rest...>())
{
return {};
}
Sowohl gcc und Klappern Drossel auf diesem. Clang sagt:
test.cpp:54:40: error: 'Rest' does not refer to a value
constexpr auto test() -> decltype(test<Rest...>())
^
gcc klagt:
test.cpp:54:44: error: expected primary-expression before ‘...’ token
constexpr auto test() -> decltype(test<Rest...>())
Ich denke, das liegt daran, dass die variadische Version von Test ist nicht einmal vollständig erklärt, wenn die decltype
es betrachtet.
Allerdings, wenn ich Rückgabetyp Abzug in C++ verwenden 14, das kompiliert just fine:
constexpr auto test() -> bool;
template <typename T, typename... Rest>
constexpr auto test()
{
return test<Rest...>();
}
Scheint, wie test
ausreichend hier erklärt gilt.
Ich frage mich, warum das nicht für die decltype
Variante funktioniert? Selbst wenn ich den C++ 14-Support aktiviere?
PS: Es stellt sich heraus, dass ich nicht wirklich nennen kann sogar die C++ 14-Funktion, so vielleicht die ganze Sache verpfuscht ist ...
Ist eine reine C++ 14 Lösung in Ordnung für dich, oder würdest du lieber eine C++ 11 eins machen? – TartanLlama
Eines der Probleme ist, dass 'test <>()' nicht das gleiche wie 'test()' ist, so dass der letzte rekursive Aufruf fehlerhaft ist. – Holt
@TartanLlama Ich habe eine Lösung basierend auf Typvorlagen für C++ 11. Ich bin gerade auf dem Weg darüber gestolpert und würde gerne verstehen, was hier vor sich geht. Ich würde auch interessieren, wie man das in C++ 11 oder C++ 14 "richtig" macht. – Rumburak