Почему указанные заголовки С++ содержат <initializer_list>?

Как видно из qaru.site/info/171163/..., следующие заголовки гарантируются стандартом на #include <initializer_list>:

  • Все в [контейнерах]
  • <utility>
  • <string>
  • <algorithm>
  • <random>
  • <valarray>
  • <regex>

Большинство этих заголовков объявляют хотя бы одну функцию, которая принимает аргумент std::initializer_list<E>, поэтому имеет смысл. Тем не менее,

  • <array>, <stack> и <queue> не имеют таких функций, хотя, возможно, имеет смысл рассматривать все контейнеры равномерно здесь.
  • <utility> не имеет таких функций.
  • <iterator> имеет функции с аргументом initializer_list (rbegin, rend), но он не указан для включения <initializer_list>.

В чем причина этих исключений?

Ответы

Ответ 1

Похоже, что нет явного объяснения, только что были сделаны некоторые предложения о дополнениях к стандарту, и эти предложения были приняты.

В самом конце документа N2672 Список инициализаторов, предложенный в формулировке, он просто говорит:

В 20.2 Компоненты утилиты [утилита], пункт 1:

В этом подпункте содержатся основные шаблоны функций и классов, которые используются во всей остальной библиотеке.

Заголовок <utility> Краткое описание

     #include<initializer_list>
      namespace std {

Итак, авторы документа увидели initializer_list как полезность, и поэтому он должен быть включен в заголовок <utility>. И поэтому.

В документе не были внесены какие-либо изменения в заголовок <iterator>, поэтому они не были сделаны.