2014-10-28 49 views
31

C++標準庫頭可能以非特定的方式相互包含,因此程序員通常不應該依賴於包含另一頭的頭。然而,在少數情況下,一個頭文件會保證包含另一個頭文件,或者提供某些功能,否則需要包含另一個頭文件。那些情況是什麼?C++標準庫中的哪些標頭保證包含另一個標頭?

+3

此信息爲何有用? – Pradhan 2014-10-28 21:48:46

+4

@Pradhan例如,如果你只需要'std :: begin' /'std ::如果你包含'',你不必包含''或'' end'。 – 2014-10-28 22:23:39

+1

啊,有道理。謝謝! – Pradhan 2014-10-28 22:24:29

回答

32

這個答案忽略了C頭文件 - 這兩個文件都是<meow.h><cmeow>。 C++庫頭的(所有引用都是到N4659):

<initializer_list>是保證由被包括:

<iostream>是保證包括<ios><streambuf><istream>,和<ostream>(§30.4.1[iostream.syn])。

<ios>保證包括<iosfwd>(§30.5.1[ios.syn])。保證包括<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]swap(T&, T&)swap(T (&a)[N], T (&b)[N]))定義的兩個通用std::swap重載保證是可用的。 size/empty/data,但是,沒有。 (§24.4.1[string.view.synop])。

+0

@ShafikYaghmour在比較N3337和N4140之後,唯一的區別是在C++ 11中缺少'std :: cbegin'等。大部分內容在相應標題的簡介中。 – 2014-10-28 18:16:28