在 C++ 标准库中的哪些标头保证包含另一个标头中有一个声明?:
C++ 标准库头文件可能以未指定的方式相互包含,因此程序员通常不应该依赖一个头文件包括另一个头文件。[...]
在实践中,情况往往如此。例如,<iostream>
可能包含<string>
,在其他情况下您需要<string>
显式包含。但是,我似乎无法在 N4140 中找到这种情况。我看过:
- §2.9 [lex.header]
- §17.6.1.2 [标题]
- §17.6.2.2 [using.headers]
- §17.6.4.4 [alt.headers]
- §17.6.5.2 [res.on.headers]
我能找到的最接近的是 [using.headers]:
2 翻译单元可以以任何顺序包含库头(第 2 条)。每个都可以被包含多次,与只包含一次没有任何不同的效果,除了每次包含一个
<cassert>
或的效果<assert.h>
取决于NDEBUG的词汇当前定义。178
但这似乎适用于 C++ 程序,而不是标准库:
[using.overview]/1 本节描述 C++ 程序如何访问 C++ 标准库的功能。[...]
以及 [res.on.headers]:
1 C++ 标头可能包含其他 C++ 标头。C++ 头文件应提供出现在其概要中的声明和定义。在其概要中显示为包括其他 C++ 头的 C++ 头应提供出现在这些其他头的概要中的声明和定义。
我认为关键是第一句话,但它并没有明确说它是未指定的行为。它是否在任何地方说明这是未指定的行为,还是只是暗示?