在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等。 我们可以假设始终包含在所有平台上吗?或者更一般,标准是否说明标题标题必须包含哪些标题?
答案 0 :(得分:7)
不,没有这样的保证。标准只规定了标题必须提供的定义。在[thread.threads]的情况下,您会发现概要不包含任何#include
。这对于其他标题可以是不同的,但是仍然只需要列出的标题,参见例如[bitset]。
例如,TDM GCC 4.9.2的thread
标头不包含iosfwd
或exception
等标头文件。
作为一个明确的例子,以下编译在我的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});
}
话虽如此,您应该始终包含所有必需的顶级标题,以提供您需要的符号。