Es scheint, dass der Iterator-Adapter reverse_iterator
die meisten seiner verschachtelten Typen doppelt definiert. Insbesondere erbt es öffentlich von std::iterator
, wodurch iterator_category
, value_type
, difference_type
, pointer
und reference
verfügbar gemacht werden. Mit Ausnahme von iterator_category
und value_type
werden diese explizit explizit in der Klassendefinition angegeben.
24.5.1.1 Klassenvorlage reverse_iterator [reverse.iterator]
%Vor% Frage : Warum die repetitive Definition? Ist das nur für die Zwecke der Exposition oder gibt es mehr dazu? Und warum nicht typedef
und iterator_category
neu definieren?
Seit einiger Zeit haben sie sich von der Verwendung von std::iterator
als Basisklasse entfernt und müssen lediglich angeben, dass jeder Iterator die korrekten Typnamen definieren muss.
Wenn sie die Basisklasse im Standard angeben, wird dadurch die Implementierung der Klasse eingeschränkt, obwohl die einzige wirkliche Absicht darin besteht, anzugeben, dass der Iterator einige Namen definieren muss. Insbesondere könnten Sie is_base_of
ermitteln, um festzustellen, ob std::iterator
eine Basisklasse von std::reverse_iterator
ist. Nein, es gibt nichts polymorphes, also ist es ziemlich dumm und sinnlos, das zu tun, aber wenn du das tust, sagt der aktuelle Standard, dass es muss true zurückgeben soll.
Es sieht (für mich) so aus, als wäre es mehr oder weniger ein zufälliger Zwischenpunkt im Prozess der (mehr oder weniger zufälligen) Bewegung, der die Verwendung von std::iterator
als Basisklasse erfordert und einfach die Namen dafür angibt muss in std::reverse_iterator
definiert sein (und natürlich auch in verschiedenen anderen Iteratoren).
Für diejenigen, die sich interessieren, umfasst die Geschichte davon:
Es gibt auch so ähnliche Diskussionspapiere über die Abschaffung von unary_function und binary_function:
Diese wurden aus ungefähr den gleichen Gründen wie std::iterator
bereitgestellt (dh, um einige typedefs in einer abgeleiteten Klasse bereitzustellen), so dass die Gründe für ihre Entfernung ziemlich passend sind, std::iterator
als Basisklasse zu verwenden / p>
Dies ist eher eine Vermutung, aber all diese redundanten typedefs
deklarieren Typen, die innerhalb der Spezifikation des Klassenkörpers von reverse_iterator
verwendet werden. Zum Beispiel (C ++ 03 IS):
Da iterator<..>
eine abhängige Basisklasse ist, wird nicht nach den Namen pointer
und reference
gesucht. Wenn typedef
diese Namen verwendet, wird die verbleibende Spezifikation vereinfacht:
Andererseits erscheint value_type
nicht innerhalb des Klassenkörpers, daher benötigt es kein redundantes typedef
.
Tags und Links c++ language-lawyer iterator reverse-iterator iterator-traits