Warum definiert reverse_iterator seine verschachtelten Typen doppelt?

8

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?

    
TemplateRex 17.03.2015, 20:21
quelle

2 Antworten

6

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:

N3931
Ausgabe 2438

Es gibt auch so ähnliche Diskussionspapiere über die Abschaffung von unary_function und binary_function:

N3145
N3198

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>     

Jerry Coffin 17.03.2015, 20:37
quelle
3

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):

%Vor%

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:

%Vor%

Andererseits erscheint value_type nicht innerhalb des Klassenkörpers, daher benötigt es kein redundantes typedef .

    
dyp 17.03.2015 20:47
quelle