Seit einiger Zeit haben sie sich von der Verwendung von %code% 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 %code% ermitteln, um festzustellen, ob %code% eine Basisklasse von %code% 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 %code% als Basisklasse erfordert und einfach die Namen dafür angibt muss in %code% 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 %code% bereitgestellt (dh, um einige typedefs in einer abgeleiteten Klasse bereitzustellen), so dass die Gründe für ihre Entfernung ziemlich passend sind, %code% als Basisklasse zu verwenden / p>
Dies ist eher eine Vermutung, aber all diese redundanten %code% deklarieren Typen, die innerhalb der Spezifikation des Klassenkörpers von %code% verwendet werden. Zum Beispiel (C ++ 03 IS):
%Vor%Da %code% eine abhängige Basisklasse ist, wird nicht nach den Namen %code% und %code% gesucht. Wenn %code% diese Namen verwendet, wird die verbleibende Spezifikation vereinfacht:
%Vor%Andererseits erscheint %code% nicht innerhalb des Klassenkörpers, daher benötigt es kein redundantes %code% .
Es scheint, dass der Iterator-Adapter %code% die meisten seiner verschachtelten Typen doppelt definiert. Insbesondere erbt es öffentlich von %code% , wodurch %code% , %code% , %code% , %code% und %code% verfügbar gemacht werden. Mit Ausnahme von %code% und %code% 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 %code% und %code% neu definieren?