c++ initializer-list

¿Por qué se especifican estos encabezados de C++ para incluir<initializer_list>?



initializer-list (1)

Parece que no hay una justificación explícita, solo que se hicieron algunas propuestas de adiciones a la norma y se aceptaron esas propuestas.

Al final del documento N2672 Initializer List, la redacción propuesta simplemente dice:

En 20.2 componentes de utilidad [utilidad] párrafo 1:

Esta subcláusula contiene algunas funciones básicas y plantillas de clase que se utilizan en el resto de la biblioteca.

Encabezado <utility> sinopsis

#include<initializer_list> namespace std {

Por lo tanto, los autores del artículo vieron initializer_list como una utilidad, por lo que debería incluirse con el encabezado <utility> . Y por lo tanto es.

El documento no propuso ningún cambio en el encabezado <iterator> , por lo que no se realizó ninguno.

Como se puede ver en https://stackoverflow.com/a/26614984/481267 los siguientes encabezados están garantizados por el estándar para #include <initializer_list> :

  • Todo en [contenedores]
  • <utility>
  • <string>
  • <algorithm>
  • <random>
  • <valarray>
  • <regex>

La mayoría de estos encabezados declaran al menos una función que toma un argumento std::initializer_list<E> , por lo que tiene sentido. Sin embargo,

  • <array> , <stack> y <queue> no tienen tales funciones, aunque quizás tenga sentido tratar todos los contenedores de manera uniforme aquí.
  • <utility> no tiene tales funciones.
  • <iterator> tiene funciones con un argumento initializer_list ( rbegin , rend ) pero no está especificado para incluir <initializer_list> .

¿Cuál es la razón detrás de estas excepciones?