¿Qué encabezados en la biblioteca estándar de C ++ tienen garantizado incluir otro encabezado?

Los encabezados de biblioteca estándar de C ++ pueden incluirse entre sí de formas no especificadas, por lo que los progtwigdores generalmente no deberían depender de un encabezado que incluya otro. Sin embargo, en algunos casos, se garantiza que un encabezado incluya otro encabezado, o ponga a disposición ciertas funciones que de otro modo requerirían la inclusión de otro encabezado. ¿Cuáles son esos casos?

Esta respuesta ignora los encabezados C, tanto los como . De los encabezados de biblioteca C ++ (todas las referencias son a N4659):

está garantizado para ser incluido por:

  • (§23.2.1 [utility.syn] )
  • (§24.3.1 [string.syn] )
  • (§26.3.2 [array.syn] )
  • (§26.3.3 [deque.syn] )
  • (§26.3.4 [forward_list.syn] )
  • (§26.3.5 [list.syn] )
  • (§26.3.6 [vector.syn] )

  • (§26.4.2 [asociative.map.syn] )

  • (§26.4.3 [asociative.set.syn] )
  • unordered_map (§26.5.2 [unord.map.syn] )
  • unordered_set (§26.5.3 [unord.set.syn] )
  • (§26.6.2 [queue.syn] )
  • (§26.6.3 [stack.syn] )
  • (§28.2 [algorithms.syn] )
  • (§29.6.2 [rand.synopsis] )
  • (§29.7.1 [valarray.syn] )
  • (§31.4 [re.syn] )

garantiza incluir , , y (§30.4.1 [iostream.syn] ).

está garantizado para incluir (§30.5.1 [ios.syn] ).

garantiza incluir y (§23.9.1 [bitset.syn] ).

Las plantillas de funciones gratuitas std::begin , std::end , las versiones de C ++ 14 c- , r- y cr- y las plantillas de funciones libres de C ++ 17 std::size , std::empty y std::data residen nominalmente en , pero también están disponibles si se incluye alguno de los siguientes encabezados: , , , ,

, , , , , , y (§27.7 [ iterator.range ] , §27.8 [ iterator.container ] ).

Cuando se incluye , las funciones *begin y *end , y las dos sobrecargas std::swap genéricas definidas en [utility.swap] ( swap(T&, T&) y swap(T (&a)[N], T (&b)[N]) ) están garantizados para estar disponibles. size/empty/data , sin embargo, no lo son. (§24.4.1 [string.view.synop] ).