Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

<initializer_list> гарантируется включение:

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

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

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

Шаблоны бесплатных функций std::begin, std::end, версии С++ 14 c-, r- и cr-, а также шаблоны свободных функций С++ 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]).