web-dev-qa-db-de.com

Warum ist std :: iterator veraltet?

Template Klasse std::iterator ist in C++ 17 veraltet. Warum so? Es war ein praktischer Weg, um sicherzustellen, dass std::iterator_traits funktioniert, insbesondere wenn Sie die Standardvorlagenargumente verwenden können. Gibt es eine andere Möglichkeit, dies in C++ 17 zu tun?

37
aschepler

Von der Vorschlag, der seine Verfallserklärung vorgeschlagen hat :

Um das Schreiben von Iteratorklassen zu erleichtern, stellte die ursprüngliche Standardbibliothek die Iteratorklassenvorlage zur Verfügung, mit der die Deklaration der fünf von iterator_traits für jeden Iterator erwarteten Typedefs automatisiert werden kann. Dies wurde dann in der Bibliothek selbst verwendet, zum Beispiel in der Spezifikation von std::ostream_iterator:

template <class T, class charT = char, class traits = char_traits<charT> >
class ostream_iterator:
  public iterator<output_iterator_tag, void, void, void, void>;

Die lange Abfolge von void Argumenten ist für den Leser weitaus weniger klar, als lediglich die erwarteten Typendefinitionen in der Klassendefinition selbst anzugeben. Dies ist der Ansatz des aktuellen Arbeitsentwurfs nach dem in C++ 14 festgelegten Muster Dabei haben wir die Ableitung von unary_function und binary_function in der gesamten Bibliothek von Funktoren verworfen.

Zusätzlich zu der verringerten Klarheit stellt die Iterator-Vorlage auch eine Falle für Unachtsame dar, da es sich bei der typischen Verwendung um eine abhängige Basisklasse handelt, was bedeutet, dass sie während der Namenssuche innerhalb der Klasse oder ihrer Mitgliedsfunktionen nicht untersucht wird. Dies führt zu überraschten Benutzern, die versuchen zu verstehen, warum die folgende einfache Verwendung nicht funktioniert:

#include <iterator>

template <typename T>
struct MyIterator : std::iterator<std::random_access_iterator_tag, T> {
   value_type data;  // Error: value_type is not found by name lookup 

   // ... implementations details elided ...
};

Der Grund für die Klarheit allein war ausreichend, um die LWG davon zu überzeugen, die Standardbibliotheksspezifikation so zu aktualisieren, dass die Standarditeratoradapter nicht mehr von std::iterator Abgeleitet sind, sodass diese Vorlage im Standard selbst nicht mehr verwendet wird. Daher sieht es aus wie ein starker Kandidat für die Abwertung.

Sie können die Argumentation von STL auch in LWG 2438 sehen. (h/t T.C. )


Wie für eine andere Art, es zu tun, nicht wirklich. Sie können im Grunde genommen Ihre eigene Version von std::iterator Implementieren (was nicht zu schwierig ist) oder alle diese Typendefinitionen manuell ausschreiben (was auch nicht zu schwierig ist, und ich bevorzuge es aus Gründen der Klarheit).

26
Barry