C++ 标准库中的哪些标头保证包含另一个标头?

Which headers in the C++ standard library are guaranteed to include another header?

提问人:T.C. 提问时间:10/29/2014 最后编辑:rsjaffeT.C. 更新时间:1/31/2021 访问量:2326

问:

C++ 标准库标头可能以未指定的方式相互包含,因此程序员通常不应依赖一个标头包括另一个标头。但是,在少数情况下,可以保证一个标头包含另一个标头,或者提供某些功能,否则这些函数将需要包含另一个标头。这些情况是什么?

C++ 11 14 头文件 C++20

评论

3赞 Pradhan 10/29/2014
为什么这些信息有用?
6赞 T.C. 10/29/2014
@Pradhan 例如,知道如果你包含了,你就不必包括 ,或者你只需要 /,这是很有用的。<vector><initializer_list><iterator>std::beginstd::end
1赞 Gab是好人 12/2/2016
@T.C.但是,不显式指定声明所使用的类型的头文件是一个坏主意。这将使代码更难阅读,即使它可以使编译速度更快一点。开发人员不应该知道保证的包含。好吧,对于 std::begin 的情况,这是显而易见的,但对于其他情况,它可能不是。
0赞 screwnut 1/31/2021
随时提供您使用的内容。即使只需要 30 秒向同事解释你为什么这样做,也不这样做也有缺点。你已经花了更多的时间来解释它,而不是做正确的事情。
0赞 Sz. 9/7/2023
但是,@screwnut,如果它是隐式使用的(这是绝大多数情况),则是一个例外。它如此无缝地融入到语法中,以至于它可以被认为是 std 容器的内部实现细节,从这个角度来看,显式地包含它甚至感觉像是错误的事情。(如果你正在实现你自己的容器,并显式使用它,那就另当别论了——当然,包括它在那里。initializer_list

答:

39赞 T.C. 10/29/2014 #1

此答案忽略 C 标头 - 和 ones。在 C++ 库标头中(所有引用均指向 N4659):<meow.h><cmeow>

<initializer_list>保证包括:

<iostream>保证包括 、 、 和 (§30.4.1 [iostream.syn])。<ios><streambuf><istream><ostream>

<ios>保证包括 (§30.5.1 [ios.syn])。<iosfwd>

<bitset>保证包括 和 (§23.9.1 [bitset.syn])。<string><iosfwd>

自由函数模板 、 、 C++ 、 和 版本以及 C++17 自由函数模板 和 名义上位于 中,但如果包含以下任何标头,也可以使用:、 、 、 、 、 和 (§27.7 [迭代器范围], §27.8 [迭代器.容器])。std::beginstd::endc-r-cr-std::sizestd::emptystd::data<iterator><array><deque><forward_list><list><map><regex><set><string><unordered_map><unordered_set><vector>

如果包含,则保证 and 函数和 [utility.swap] ( 和 ) 中定义的两个泛型重载可用。但是,不是(§24.4.1 [string.view.synop])。<string_view>*begin*endstd::swapswap(T&, T&)swap(T (&a)[N], T (&b)[N])size/empty/data

评论

0赞 T.C. 10/29/2014
@ShafikYaghmour 比较 N3337 和 N4140 后的唯一区别是 C++11 中缺少等。其中大部分内容都在相应标题的概要中。std::cbegin
1赞 rsjaffe 1/31/2021 #2

以下是C++20的强制性包含,取自N4860

比较包含在以下内容中:

  • 数组
  • 计时码表
  • 协程
  • 德克
  • 文件系统
  • forward_list
  • 迭 代
  • 列表
  • 地图
  • 记忆
  • 自选
  • 队列
  • 范围
  • 正则表达式
  • 设置
  • 字符串
  • string_view
  • system_error
  • 线
  • 类型索引
  • unordered_map
  • unordered_set
  • 效用
  • 变体
  • 向量

initializer_list包含在以下内容中:

  • 算法
  • 数组
  • 德克
  • forward_list
  • 列表
  • 地图
  • 队列
  • 随机
  • 范围
  • 正则表达式
  • 设置
  • 字符串
  • 线
  • unordered_map
  • unordered_set
  • 效用
  • 瓦拉阵列
  • 向量

字符串包含在以下内容中:

  • 位集

IOSFWD包含在以下内容中:

  • 位集
  • iOS系统

概念包含在以下内容中:

  • 迭 代

迭代器包含在以下内容中:

  • 范围

iOS、Streambuf、ISTREAM 包含在:

  • IO流

ostream 包含在以下内容中:

  • IO流
  • 同步流

Cinttypes 包含在以下内容中:

  • cst丁

评论

0赞 jmk 9/9/2022
关于 cinttypes 和 cstdint 的最后一点,您链接的论文 (29.12.2) 对它的定义恰恰相反:cstdint 不包括 cinttypes,但 cstdint 包含在 cinttypes 中。