Какие заголовки в стандартной библиотеке C++ гарантированно включают другой заголовок?

Заголовки стандартной библиотеки C++ могут включать друг друга неуказанным образом, поэтому программисты, как правило, не должны зависеть от того, включает ли один заголовок другой. Однако в некоторых случаях заголовок гарантированно включает другой заголовок или делает доступными определенные функции, которые в противном случае потребовали бы включения другого заголовка. Что это за случаи?


person T.C.    schedule 28.10.2014    source источник
comment
Почему эта информация полезна?   -  person Pradhan    schedule 29.10.2014
comment
@Pradhan Полезно знать, например, что если вы включили <vector>, вам не нужно включать <initializer_list> или <iterator>, если вам просто нужно std::begin/std::end.   -  person T.C.    schedule 29.10.2014
comment
@Т.С. Но не указывать явно заголовочный файл, в котором объявлен используемый тип, — плохая идея. Это затруднит чтение кода, хотя компиляция может немного ускориться. Разработчики не должны знать о гарантированных включениях. Что ж, для случая std::begin это очевидно, а для других случаев может и нет.   -  person Gab是好人    schedule 02.12.2016
comment
Пожалуйста, всегда указывайте, что вы используете. Есть только минусы в том, чтобы не делать этого, даже если вам потребуется всего 30 секунд, чтобы объяснить коллегам, почему вы это сделали. Вам уже потребовалось больше времени, чтобы объяснить это, чем сделать правильную вещь.   -  person screwnut    schedule 30.01.2021


Ответы (2)


Этот ответ игнорирует заголовки C - как <meow.h>, так и <cmeow>. Из заголовков библиотеки С++ (все ссылки на N4659):

<initializer_list> гарантированно будет включен:

<iostream> гарантированно включает <ios>, <streambuf>, <istream> и <ostream> (§30.4.1 [ iostream.syn]).

<ios> гарантированно включает <iosfwd> (§30.5.1 [ios.syn]).

<bitset> гарантированно включает <string> и <iosfwd> (§23.9.1 [bitset.syn]< /а>).

Бесплатные шаблоны функций std::begin, std::end, версии C++14 c-, r- и cr-, а также бесплатные шаблоны функций C++17 std::size, std::empty и std::data номинально находятся в <iterator>, но также доступны, если какой-либо из следующих заголовков включены: <array>, <deque>, <forward_list>, <list>, <map>, <regex>, <set>, <string>, <unordered_map>, <unordered_set> и <vector> (§27.7 [iterator.range], §27.8 [iterator.container]).

Когда включен <string_view>, функции *begin и *end, а также две общие перегрузки std::swap, определенные в [utility.swap] (swap(T&, T&) и swap(T (&a)[N], T (&b)[N])) гарантированно доступны. size/empty/data, однако, нет. (§24.4.1 [string.view.synop]) .

person T.C.    schedule 28.10.2014
comment
@ShafikYaghmour Единственное отличие после сравнения N3337 и N4140 заключается в отсутствии std::cbegin и т. Д. В C ++ 11. Большая часть этого находится в синопсисе для соответствующих заголовков. - person T.C.; 28.10.2014

Вот обязательные включения для C++20, взятые из N4860.

сравнение включено в:

  • множество
  • хроно
  • сопрограмма
  • дека
  • файловая система
  • список_вперед
  • итератор
  • список
  • карта
  • Память
  • необязательный
  • очередь
  • диапазоны
  • регулярное выражение
  • задавать
  • куча
  • нить
  • string_view
  • системная ошибка
  • нить
  • кортеж
  • указатель типа
  • unordered_map
  • unordered_set
  • полезность
  • вариант
  • вектор

initializer_list включен в:

  • алгоритм
  • множество
  • дека
  • список_вперед
  • список
  • карта
  • очередь
  • случайный
  • диапазоны
  • регулярное выражение
  • задавать
  • куча
  • нить
  • нить
  • unordered_map
  • unordered_set
  • полезность
  • валаррай
  • вектор

строка включена в:

  • набор битов

iosfwd входит в состав:

  • набор битов
  • iOS

понятия входят в состав:

  • итератор

итератор включен в:

  • диапазоны

ios, streambuf, istream включены в:

  • iostream

ostream входит в состав:

  • iostream
  • синхронизация

cinttypes входит в состав:

  • cstdint
person rsjaffe    schedule 30.01.2021