Domanda

La libreria standard comprende un header <iosfwd>, che (in avanti) dichiara tutti i flussi comprese eventuali typedefs e definisce il modello char_traits, comprese le specializzazioni.

Purtroppo, non v'è alcuna intestazione <stlfwd> che (in avanti) dichiara tutti i tipi di dati comuni STL e le funzioni come vector, map, less, sort, ecc Ancora più triste, il codice utente non è consentito di aggiungere tali dichiarazioni / typedefs a lo spazio dei nomi std, come da

§17.4.3.1 [lib.reserved.names] p1:

Non è definito per un C + + programma per aggiungere dichiarazioni o definizioni per std namespace o spazi dei nomi all'interno dello spazio dei nomi std se non diversamente specificato. Un programma può aggiungere specializzazioni modello per qualsiasi modello standard per namespace std.

Sì, che copre il caso di (Avanti) dichiarazioni, anche se esistono già i tipi nella libreria standard. Naturalmente, la maggior parte (tutti?) Compilatori si comportano perfettamente normale, anche se si aggiunge tali dichiarazioni, ma rigorosamente e l'avvocato lingua parlando, è un comportamento indefinito. Trovo che questo sia particolarmente noioso per typedefing contenitori standard, come:

// how to forward declare map and string?

typedef std::map<std::string, std::string> Attributes;

Ora, questo può essere considerato un difetto?

intendo sia la non-esistenza di un colpo di testa <stlfwd> (o meglio, <stdfwd>, coprendo <iosfwd> troppo) e il divieto di dichiarazioni già esistenti nella libreria standard.

Inoltre, secondo questa domanda , se uno (avanti) dichiara il contenitore standard, algoritmi e funtori / funzionali esattamente come richiesto dalla norma, il codice dovrebbe essere perfettamente valido (se non fosse per il divieto delle dichiarazioni user-made nello spazio dei nomi std), perché le implementazioni aren' t ha permesso di aggiungere eventuali parametri nascosti / template di default.

Chiedo questo perché sto pensando di presentare una relazione alla fine dei difetti per quanto riguarda questo.

È stato utile?

Soluzione

Quale sarebbe lo scopo della avanti dichiarando less dire o sort o realmente qualsiasi altro algoritmo? Se stai passando un algoritmo di uso generale intorno ad essa sarà quasi certamente come un tipo di modello e non ha bisogno di una dichiarazione in avanti a tutti.

che ci lascia con i tipi di contenitori. Ci sono sicuramente casi in cui le dichiarazioni previsionali di loro sarebbe utile, ma ho il sospetto che è stato semplicemente deciso che come ogni definizione contenitore è relativamente semplice (rispetto a iostreams) sarebbe preferibile utilizzare solo la piena includono piuttosto che una includere per esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top