Заголовки стандартной библиотеки С++ могут включать друг друга неуказанными способами, поэтому программисты обычно не должны зависеть от одного заголовка, включая другой. В некоторых случаях, однако, заголовок гарантированно включает в себя другой заголовок или предоставляет определенные функции, которые в противном случае требовали бы включения другого заголовка. Каковы эти случаи?
Какие заголовки в стандартной библиотеке С++ гарантированно включают другой заголовок?
Ответ 1
В этом ответе игнорируются заголовки C - как теги <meow.h>
, так и <cmeow>
. Из заголовков библиотек С++ (все ссылки относятся к N4659):
<initializer_list>
гарантируется включение:
-
<utility>
(§23.2.1 [utility.syn]) -
<string>
(§24.3.1 [string.syn]) -
<array>
(§26.3.2 [array.syn]) -
<deque>
(§26.3.3 [deque.syn]) -
<forward_list>
(§26.3.4 [forward_list.syn]) -
<list>
(§26.3.5 [list.syn]) -
<vector>
(§26.3.6 [vector.syn]) -
<map>
(§26.4.2 [associative.map.syn]) -
<set>
(§26.4.3 [associative.set.syn]) -
<unordered_map>
(§26.5.2 [unord.map.syn]) -
<unordered_set>
(§26.5.3 [unord.set.syn]) -
<queue>
(§26.6.2 [queue.syn]) -
<stack>
(§26.6.3 [stack.syn]) -
<algorithm>
(§28.2 [algorithmms.syn]) -
<random>
(§29.6.2 [rand.synopsis]) -
<valarray>
(§29.7.1 [valarray.syn]) -
<regex>
(§31.4 [re.syn])
<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]).