¿Por qué hay istream y ostream en C++ ya que hay iostream?

La pregunta que se hizo originalmente fue:

¿Por qué hay istream y ostream en C++ ya que hay iostream?

Tomo esta pregunta para decir, "¿por qué no es suficiente que el estándar tenga la cabecera ? ¿Por qué necesitamos también las dos subpartes, y ?"

Prepararé mi respuesta diciendo que las razones actuales no son necesariamente buenas razones en el mundo actual. La biblioteca iostream es una de las partes más antiguas de la biblioteca estándar de C++, y hay muchas cosas en ella que los miembros del comité de estándares de C++ de hoy cambiarían si pudiéramos empezar de nuevo. Con esta exención de responsabilidad, hay dos razones principales para tener las tres cabeceras en lugar de sólo una:

  1. Si sólo necesita una de istream u ostream, entonces se ralentiza la compilación al incluir ambas. iostream incluye ambas.
  2. Más importante, la cabecera iostream declara e inicializa los flujos estándar, cout, cerr, clog, cin, y sus equivalentes de caracteres anchos. Esta inicialización trae un montón de equipaje (incluyendo el mecanismo de contador de trucos utilizado para evitar la duplicación de las inicializaciones), y hace estragos con las bibliotecas compartidas. Puede ser contra-intuitivo, pero ni istream ni ostream declaran los flujos estándar.

Mi consejo típico es: Para los programas de juguete, utilice iostream. Para componentes de programas reales, prefiera usar istream, ostream, o ambos, a menos que necesite referirse a un flujo estándar por su nombre.

EDIT: La moderación de Quora sigue invirtiendo el significado de esta pregunta para que no tenga sentido. 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.