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?
risposta
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
.
"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
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
@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
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
Compatibilità con le versioni precedenti. –
Poiché le convenzioni di denominazione e, in effetti, i nomi in C++ sono completamente confusi, proprio come erano in C. – EJP