C ++标准是否包含标准头必须包含的内容?

时间:2017-08-08 06:12:50

标签: c++

在visualstudio上,标题“thread”包含以下所有标题:

#include <exception>
#include <iosfwd>
#include <functional>
#include <chrono>
#include <memory>
#include <tuple>

现在我们可以使用它:

#include <thread>
using namespace std;
this_thread::sleep_for(1s);

所以在VS上你不必再次包含“chrono”就可以使用1s 1000ms等。 我们可以假设始终包含在所有平台上吗?或者更一般,标准是否说明标题标题必须包含哪些标题?

1 个答案:

答案 0 :(得分:7)

不,没有这样的保证。标准只规定了标题必须提供的定义。在[thread.threads]的情况下,您会发现概要不包含任何#include。这对于其他标题可以是不同的,但是仍然只需要列出的标题,参见例如[bitset]。

例如,TDM GCC 4.9.2的thread标头不包含iosfwdexception等标头文件。

作为一个明确的例子,以下编译在我的GCC 5上但不在GCC 7上编译,因为在标准库的更新中,GCC维护者决定algorithm不应再包含numeric

#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v = {1,2,3,4};
    int sum = std::accumulate(std::begin(v), std::end(v), int{0});
}

话虽如此,您应该始终包含所有必需的顶级标题,以提供您需要的符号。

相关问题