2015-03-09 14 views
40

Tutti i nomi nella libreria C++ standard sono in minuscolo tranne std::ios_base::Init. Perchè è questo?Perché "Init" in std :: ios_base :: Init uppercase?

+0

Direi che è semplicemente perché fa un sacco di importanti operazioni di inizializzazione, manutenzione e pulizia per i flussi di I/O. È unico al riguardo, quindi ha ottenuto una capitale. – IVlad

+1

Compatibilità con le versioni precedenti. –

+1

Poiché le convenzioni di denominazione e, in effetti, i nomi in C++ sono completamente confusi, proprio come erano in C. – EJP

risposta

22

In uno dei primi draft delle classi iostream si può vedere che ios_base non era originariamente presente, basic_ios è stata la classe di base ed è stato responsabile per Init e gli altri membri che sono stati successivamente separati in ios_base.

basic_ios avuto anche (e still has) una funzione init, e mentre i due nomi non necessariamente devono essere distinte, presumibilmente per cercare di evitare confusione si è deciso di denominare la classe Init e la funzione init. Inoltre, senza questa distinzione qualcosa di simile al seguente sarebbe stato necessario quando si utilizza la classe:

struct ios_base 
{ 
    struct init{}; 
    void init(); 
}; 

ios_base::init i1;  // error 
struct ios_base::init i2; // ok 

L'idea di avere una classe separata responsabile dell'inizializzazione dei flussi standard risale almeno Cfront 3.0, come si può vedere per Iostream_init nell'intestazione this. Ad un certo punto è stato deciso non solo di rendere la classe un membro di ios/basic_ios/ios_base ma che dovrebbe essere rinominata Init.

In ogni caso ha senso disambiguare i due, anche considerando il fatto che alla fine sono stati collocati in classi separate. Avrebbero potuto invece scegliere nomi completamente separati, ma presumibilmente Init/init è stata considerata la migliore scelta semantica per descrivere cosa fanno la classe e la funzione, e c'è anche la possibilità che si limitasse a imitare il vecchio Iostream_init, che per qualche motivo inizia anche con una maiuscola I.

+1

"deve" è troppo forte, ma sì, una funzione membro con lo stesso nome della classe membro della classe base causerebbe la nascosta di quella classe membro. – hvd

+2

Hmm ... Ispezionando implementazioni libstdC++ pre-standard, nell'evoluzione che portava allo standard C++ 98, c'era un punto in cui c'era solo una classe 'ios' contenente sia' Init' che 'init'. A quel punto, i diversi nomi erano assolutamente necessari, non solo belli da avere. – hvd

+1

@hvd Ho riformulato la risposta grazie al tuo commento, la distinzione init/init sembra davvero un artefatto di un lontano passato. Vorrei sottolineare che una funzione e una classe con lo stesso nome possono ancora felicemente coesistere nello stesso ambito. – user657267