Perché non c'è intestazione e può l'inesistenza di essere considerato un difetto?
-
26-10-2019 - |
Domanda
La libreria standard comprende un header <iosfwd>
, che (in avanti) dichiara tutti i flussi comprese eventuali typedef
s 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 / typedef
s 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 nomistd
se non diversamente specificato. Un programma può aggiungere specializzazioni modello per qualsiasi modello standard per namespacestd
.
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 typedef
ing 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.
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