Heim > Artikel > Backend-Entwicklung > Warum ist eine teilweise Ableitung von Klassenvorlagenargumenten nicht möglich?
Abzug von Vorlagenargumenten für Klassenvorlagen: Einschränkungen und Implikationen
Im Zuge des P0091-Vorschlags zur Vereinheitlichung des Abzugsverhaltens von Vorlagenargumenten für Funktion und Klassenvorlagen stellt sich die Frage: Warum ist eine teilweise Ableitung von Klassenvorlagenargumenten nicht möglich?
Der ursprüngliche Vorschlag zielte darauf ab Passen Sie die Abzugsmechanismen an und ermöglichen Sie in beiden Kontexten einen teilweisen Abzug. Allerdings gab es Bedenken hinsichtlich möglicher Verwirrung, wenn die abgeleiteten Werte mehrere gültige Vorlagenspezialisierungen ergeben. Ein klassisches Beispiel ist die Ableitung eines Tupeltyps: Durch die Angabe nur eines Arguments könnte der Compiler auf ein Tupel mit einem einzelnen Element schließen, obwohl die ursprüngliche Tupeldefinition mehrere Elemente enthält.
Um solche Mehrdeutigkeiten zu verhindern, teilweise Der Argumentabzug für die Klassenvorlage wurde aus dem Vorschlag entfernt. Diese Einschränkung betrifft Szenarien, in denen Entwickler möglicherweise bestimmte Vorlagenparameter explizit angeben möchten, während andere abgeleitet werden müssen.
Betrachten Sie beispielsweise die folgende Klassenvorlage:
template <std::size_t S, typename T> struct test { static constexpr auto size = S; using type_t = T; test(type_t (&input)[size]) : data(input) {} type_t (&data)[size]{}; };
Eine Hilfsfunktion dient als ein syntaktischer Zucker zum Instanziieren von Testobjekten:
template <std::size_t S, typename T> test<S, T> helper(T (&input)[S]) { return input; }
Bei Verwendung des Helfers mit einem vordeklarierten array:
int buffer[5]; auto a = helper<5, int>(buffer); // No deduction auto b = helper<5>(buffer); // Type deduced auto c = helper(buffer); // Type and size deduced
Teilweiser Abzug wird im Fall von Klassenvorlagen nicht unterstützt, was durch den Fehler von auto b = helper<5>(buffer); belegt wird. Der Compiler kann den T-Parameter nicht aus dem Argument ableiten, was zu einem Kompilierungsfehler führt. Stattdessen auto c = helper(buffer); leitet erfolgreich sowohl S als auch T ab und zeigt damit die Notwendigkeit, alle Vorlagenparameter explizit anzugeben.
Das obige ist der detaillierte Inhalt vonWarum ist eine teilweise Ableitung von Klassenvorlagenargumenten nicht möglich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!