C ++标准库头文件可能以非指定的方式相互包含,因此程序员通常不应该依赖于包含另一个头文件的一个头文件。但是,在少数情况下,保证标头包含另一个标头,或者使某些功能可用,否则需要包含另一个标头。这些案件是什么?
答案 0 :(得分:36)
此答案会忽略C标头 - <meow.h>
和<cmeow>
。在C ++库头文件中(所有引用都是针对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[algorithms.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.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>
,{{ 1}},<deque>
,<forward_list>
,<list>
,<map>
,<regex>
,<set>
,<string>
,{{1} }和<unordered_map>
(§27.7[iterator.range],§27.8[iterator.container])。
包含<unordered_set>
时,<vector>
和<string_view>
函数以及[utility.swap](*begin
中定义的两个通用*end
重载std::swap
}保证可用。但是,swap(T&, T&)
不是。 (§24.4.1[string.view.synop])。
答案 1 :(得分:0)
以下是 C++20 的强制包含,取自 N4860。
比较包含在:
initializer_list 包含在:
字符串包含在:
iosfwd 包含在:
概念包含在:
迭代器包含在:
ios、streambuf、istream 包含在:
ostream 包含在:
cinttypes 包含在: