A mio avviso, la libreria standard è un intero software separato rispetto a un compilatore. Secondo me, dovrebbero essere tenuti separati.
IVantaggi di questo approccio si riducono quasi a "possono evolversi indipendentemente".
Svantaggi:
-
Alcune funzioni di libreria standard potrebbero essere riscritte in funzioni di linguaggio core più moderne per essere più coerenti. A volte può portare a enormi benefici oltre a essere coerente. Gli esempi possono essere la maggior parte degli algoritmi in
<algorithm>
header quando arrivano gli intervalli. E praticamente qualsiasi modello quando arrivano i concetti. -
Poiché la libreria standard utilizza funzionalità linguistiche di base, a volte potrebbe essere difficile "sincronizzarle", seguire un modello e non divergere. Inoltre potrebbe creare una corsa caratteristica, ad es. una caratteristica del linguaggio principale e una caratteristica della libreria standard che fa la stessa cosa potrebbe essere rivaleggiare l'un l'altra per entrare nello standard. Un esempio può essere un legame strutturato. Le non dichiarazioni non possono essere un'espressione di legame strutturato, perché
std::tie()
fa la stessa cosa e si ritiene che consentire l'associazione non dichiarativa complicherebbe inutilmente le cose. Per raggiungere la conclusione, è stato necessario un po 'di ricerca e tempo. -
Alcune funzionalità entrano semplicemente in uno stato di errore (potrebbe essere che non siano state interrotte prima dell'inclusione). Un esempio può essere I / O. Ora che il linguaggio di base ha i pacchetti di parametri template, potrebbe essere possibile scrivere
printf()
come funzioni e avere anche la sicurezza di tipo. Esiste un'implementazione, chiamata fmt (Disclaimer: non sono affiliato con loro in alcun modo e non l'ho usato ampiamente ). Inoltre, la sincronizzazione con la libreria C I / O non è più necessaria.
Potrebbero esserci di più, ma quelli sono gli unici che mi sono stati in testa.
Quindi, la domanda è: perché il comitato standard ha scelto di fondere lentamente la libreria standard e il linguaggio di base? Perché non sono stati aggiunti std::tuple<>
e std::initializer_list<>
(e alcune altre funzionalità) al linguaggio principale?
Un esempio di fusione è (in) famosa conversione in std::initializer_list<>
.
ad esempio auto indices{0, 1, 6, 9};
risulterà in std::initializer_list<int>
.
Inoltre, associazione strutturata:
for (const auto& [key, value]: map) {...}
funzionerà anche se std::pair
è una funzione di libreria standard.