Trotz der Absichten des P0091: Vorlagenargumentabzugs für Klassenvorlagen-Vorschlags, das Verhalten anzupassen von Funktions- und Klassenvorlagen, teilweiser Abzug für Klassenvorlagen bleibt bestehen nicht umsetzbar.
Beachten Sie die 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]{}; };
Bei Verwendung einer Hilfsfunktion für eine einfachere Verwendung:
template <std::size_t S, typename T> test<S, T> helper(T (&input)[S]) { return input; }
Code wie:
int buffer[5]; auto a = helper<5, int>(buffer); // No deduction auto b = helper<5>(buffer); // Type deduced: FAILS auto c = helper(buffer); // Type and size deduced
erfolgreich kompiliert. In neueren Compilerversionen schlägt jedoch der teilweise Abzug (d. h. auto b = helper<5>(buffer);) fehl, was darauf hindeutet, dass der teilweise Abzug von Klassenvorlagenargumenten tatsächlich nicht unterstützt wird.
Diese Einschränkung ist auf Bedenken zurückzuführen angesprochen hinsichtlich möglicher Verwirrung in Fällen wie:
// Deduced as tuple<int, string, float> // but tuple<int> is also a valid type! tuple<int> t(42, "waldo", 2.0f);
Während der Vorschlag ursprünglich darauf abzielte, das Abzugsverhalten zu vereinheitlichen, bleibt der teilweise Abzug für Klassenvorlagen bestehen aufgrund möglicher Mehrdeutigkeitsprobleme nicht durchführbar.
Das obige ist der detaillierte Inhalt vonWarum ist die teilweise Ableitung von Klassenvorlagenargumenten immer noch nicht praktikabel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!