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

最佳答案

此答案忽略C头-<meow.h><cmeow>头。在C++库 header 中(所有引用都对N4659):

保证<initializer_list>包含在:

  • <utility>(§23.2.1[utility.syn])
  • <string>(§24.3.1[string.syn])
  • <array>(§26.3.2[array.syn])
  • <deque>(§26.3.3[deque.syn])
  • <forward_list>(§26.3.4[forward_list.syn])
  • <list>(§26.3.5[list.syn])
  • <vector>(§26.3.6[vector.syn])
  • <map>(§26.4.2[associative.map.syn])
  • <set>(§26.4.3[associative.set.syn])
  • <unordered_map>(§26.5.2[unord.map.syn])
  • <unordered_set>(§26.5.3[unord.set.syn])
  • <queue>(§26.6.2[queue.syn])
  • <stack>(§26.6.3[stack.syn])
  • <algorithm>(§28.2[algorithms.syn])
  • <random>(§29.6.2[rand.synopsis])
  • <valarray>(§29.7.1[valarray.syn])
  • <regex>(§31.4[re.syn])
  • <iostream>保证包括<ios><streambuf><istream><ostream>(第30.4.1 [iostream.syn]条)。
    <ios>保证包括<iosfwd>(第30.5.1节[ios.syn])。
    <bitset>保证包括<string><iosfwd>(第23.9.1 [bitset.syn]条)。

    自由功能模板std::beginstd::end,C++ 14 c-r-cr-版本以及C++ 17自由功能模板std::sizestd::emptystd::data标称位于<iterator>中,但如果以下任何头文件也可用包括:<array><deque><forward_list><list><map><regex><set><string><unordered_map><unordered_set><vector>(§27.7[iterator.range],§27.8[iterator.container])。

    包括<string_view>时,可以保证*begin*end函数以及[utility.swap]中定义的两个通用std::swap重载(swap(T&, T&)swap(T (&a)[N], T (&b)[N]))可用。 size/empty/data却不是。 (第24.4.1节[string.view.synop])。

    关于c++ - 确保C++标准库中的哪些 header 包含另一个 header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26614983/

    10-12 23:33