Warum gibt es keinen Header und kann die Nichteinheit davon als Defekt betrachtet werden?
-
26-10-2019 - |
Frage
Die Standardbibliothek enthält eine <iosfwd>
Header, der (vorwärts) alle Streams einschließlich aller beliebig erklärt typedef
s und definiert die char_traits
Vorlage, einschließlich der Spezialisierungen.
Leider gibt es keine solche <stlfwd>
Header, der (vorwärts) alle gemeinsamen STL -Datentypen und Funktionen erklärt vector
, map
, less
, sort
, usw. Noch traurig, Benutzercode darf solche Deklarationen nicht hinzufügen / typedef
s an die std
Namespace, gemäß
§17.4.3.1 [lib.reserved.names] p1
:
Es ist undefiniert, dass ein C + + -Programm hinzugefügt wird Erklärungen oder Definitionen zum Namespace
std
oder Namespaces im Namespacestd
Falls nicht anders angegeben. Ein Programm kann Vorlagenspezialisierungen für jede Standardbibliotheksvorlage zum Namespace hinzufügenstd
.
Ja, das deckt den Fall von (Vorwärts-) Erklärungen ab, auch wenn die Typen bereits in der Standardbibliothek vorhanden sind. Natürlich werden sich die meisten (alle?) Compiler vollkommen normal verhalten, selbst wenn man solche Erklärungen hinzufügt, aber ein nicht definiertes Verhalten streng und Sprachanwälte spricht. Ich finde das besonders mühsam für typedef
Standardbehälter wie:
// how to forward declare map and string?
typedef std::map<std::string, std::string> Attributes;
Kann dies nun als Defekt angesehen werden?
Ich meine sowohl die Nichtbelegung von a <stlfwd>
Kopfball (oder besser, <stdfwd>
, Deckung <iosfwd>
auch) und das Verbot von Erklärungen, die bereits in der Standardbibliothek vorhanden sind.
Auch nach diese Frage, Wenn einer (vorwärts) den Standardcontainer, Algorithmen und Functors / Funktionen genau so deklariert, wie der Standard verlangt wird, sollte der Code perfekt gültig sein (wenn es nicht das Verbot von benutzerdefinierten Deklarationen in der std
Namespace), da Implementierungen nicht versteckte/standardmäßige Vorlagenparameter hinzufügen können.
Ich frage das, weil ich darüber nachdenke, irgendwann einen Defektbericht darüber einzureichen.
Lösung
Was wäre der Zweck der Vorwärtsbeschaffung von Sagen? less
oder sort
Oder wirklich irgendein anderer Algorithmus? Wenn Sie einen Allzweckalgorithmus verabschieden, wird er mit ziemlicher Sicherheit als Vorlagentyp sein und benötigen überhaupt keine Vorwärtsdeklaration.
Das lässt uns mit den Behältertypen. Es gibt definitionu003Ccontainerfwd> zum Beispiel einschließen.