C++;标准库是否保证包含另一个标题? < > C++标准库头可能以不同的方式相互包含,因此程序员一般不应该依赖一个头,包括另一个头。然而,在少数情况下,保证一个头包含另一个头,或提供某些功能,否则需要包含另一个头。这些情况是什么?

C++;标准库是否保证包含另一个标题? < > C++标准库头可能以不同的方式相互包含,因此程序员一般不应该依赖一个头,包括另一个头。然而,在少数情况下,保证一个头包含另一个头,或提供某些功能,否则需要包含另一个头。这些情况是什么?,c++,c++11,c++14,header-files,c++20,C++,C++11,C++14,Header Files,C++20,此答案忽略了C标题-包括和标题。C++库标题(所有引用都是N465): 保证包含在以下内容中: (§23.2.1) (§24.3.1) ) (§26.3.3) (§26.3.4) (§26.3.5) (§26.3.6) (§26.4.2) (§26.4.3) (§26.5.2) (§26.5.3) (§26.6.2) (§26.6.3) ) (§29.6.2) (§29.7.1) (§31.4) 保证包括、、和(§30.4.1) 保证包括(§30.5.1) 保证包括和(§23.9.1) 自由

此答案忽略了C标题-包括
标题。C++库标题(所有引用都是N465):

保证包含在以下内容中:

  • (§23.2.1)
  • (§24.3.1)
  • (§26.3.3)
  • (§26.3.4)
  • (§26.3.5)
  • (§26.3.6)
  • (§26.4.2)
  • (§26.4.3)
  • (§26.5.2)
  • (§26.5.3)
  • (§26.6.2)
  • (§26.6.3)
  • (§29.6.2)
  • (§29.7.1)
  • (§31.4)
保证包括
(§30.4.1)

保证包括
(§30.5.1)

保证包括
(§23.9.1)

自由函数模板
std::begin
std::end
,C++14
C-
r-
cr-
版本,以及C++17自由函数模板
std::size
std::empty
std::data
名义上位于
中,但如果包含以下任何标题,也可以使用:
,§27.8)


如果包含
,则
*begin
*end
函数以及(
swap(T&,T&)
swap(T(&a)[N],T(&b)[N])
中定义的两个通用
std::swap
重载保证可用<但是,代码>大小/空/数据
,不是。(§24.4.1)。

以下是C++20的强制包含,摘自

比较包括在:

  • 排列
  • 计时
  • 协同程序
  • 德克
  • 文件系统
  • 转发列表
  • 迭代器
  • 名单
  • 地图
  • 记忆
  • 可选的
  • 排队
  • 范围
  • 正则表达式
  • 设置
  • 堆叠
  • 字符串视图
  • 系统错误
  • 线
  • 元组
  • 类型索引
  • 无序地图
  • 无序集
  • 效用
  • 变体
  • 载体
初始值设定项列表包含在:

  • 算法
  • 排列
  • 德克
  • 转发列表
  • 名单
  • 地图
  • 排队
  • 随机的
  • 范围
  • 正则表达式
  • 设置
  • 堆叠
  • 线
  • 无序地图
  • 无序集
  • 效用
  • valarray
  • 载体
字符串包含在:

  • 位集
iosfwd包括在:

  • 位集
  • ios
概念包括在:

  • 迭代器
迭代器包含在:

  • 范围
ios、streambuf、istream包括在:

ostream包含在以下文件中:

  • 同步流
cinttypes包含在:


@shafikyaghm比较N3337和N4140后,我们唯一的区别是C++11中缺少
std::cbegin
等。大部分信息都在各自标题的概要中。为什么这些信息有用?@Pradhan知道这一点很有用,例如,如果您包含
,则不必包含
,或者
如果您只需要
std::begin
/
std::end
@T.C.但是不明确指定声明您使用的类型的头文件是个坏主意。这将使代码更难阅读,即使它可以使编译速度加快一点。开发者不应该知道保证包含的内容。好的,对于std::begin的情况,这是显而易见的,但是对于其他情况,它可能不是。请包括您一直使用的内容。即使只需要30秒就可以向同事解释你为什么这么做,但不这么做只会带来负面影响。你花在解释上的时间比做正确的事情要多。