Perché ci sono istream e ostream in C++ visto che c’è iostream?

La domanda originariamente posta era:

Perché ci sono istream e ostream in C++ visto che c'è iostream?

Prendo questa domanda per dire, "perché non è sufficiente che lo standard abbia l'intestazione ? Perché abbiamo bisogno anche delle due sottoparti, e ?"

Preferisco la mia risposta dicendo che le ragioni attuali non sono necessariamente buone ragioni nel mondo di oggi. La libreria iostream è una delle parti più vecchie della libreria standard C++, e ci sono molte cose su di essa che i membri del comitato degli standard C++ di oggi cambierebbero se potessimo ricominciare. Con questo disclaimer fuori dai piedi ci sono due ragioni principali per avere tutti e tre gli header invece di uno solo:

  1. Se avete bisogno solo di uno di istream o ostream, allora rallenta la vostra compilazione includerli entrambi. iostream include entrambi gli altri.
  2. Più importante, l'header iostream dichiara e inizializza i flussi standard, cout, cerr, clog, cin, e i loro equivalenti a caratteri larghi. Questa inizializzazione porta con sé un sacco di bagaglio (incluso il meccanismo tricky-counter usato per evitare inizializzazioni duplicate), e gioca un brutto tiro con le librerie condivise. Può essere controintuitivo, ma né istream né ostream dichiarano i flussi standard.

Il mio consiglio tipico è: Per programmi giocattolo, usate iostream. Per i componenti di programmi reali, preferite usare istream, ostream, o entrambi, a meno che non abbiate bisogno di riferirvi ad un flusso standard per nome.

EDIT: La moderazione di Quora continua ad invertire il significato di questa domanda in modo che non abbia senso. Quora moderation changed the question to:

Why isn’t there istream and ostream in C++ since there is iostream?

To which the correct answer is: There is. Always has been.