C++ 標準ライブラリ ヘッダーは、不特定の方法で相互にインクルードする可能性があるため、通常、プログラマは 1 つのヘッダーが別のヘッダーを含むことに依存するべきではありません。ただし、いくつかのケースでは、ヘッダーに別のヘッダーが含まれていることが保証されているか、そうでなければ別のヘッダーを含める必要がある特定の機能を利用できるようになっています。それらのケースは何ですか?
2 に答える
この回答では、C ヘッダー ( と の両方) が無視<meow.h>
され<cmeow>
ます。C++ ライブラリ ヘッダーのうち (すべての参照は 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>
、、、および(§30.4.1 [iostream.syn]<streambuf>
)を含むことが保証されています。<istream>
<ostream>
<ios>
<iosfwd>
(§30.5.1 [ios.syn] )を含めることが保証されています。
<bitset>
<string>
and <iosfwd>
(§23.9.1 [bitset.syn] )を含むことが保証されています。
フリー関数テンプレートstd::begin
、std::end
C++14バージョンc-
、r-
およびcr-
バージョン、および C++17 フリー関数テンプレートおよびstd::size
は、名目上は にありますが、次のヘッダーのいずれかが含まれている場合にも使用できます: 、、、、、、、、、および( §27.7 [iterator.range]、§27.8 [iterator.container] )。std::empty
std::data
<iterator>
<array>
<deque>
<forward_list>
<list>
<map>
<regex>
<set>
<string>
<unordered_map>
<unordered_set>
<vector>
<string_view>
が含まれている場合、と*begin
関数*end
、および[utility.swap]std::swap
で定義されている 2 つの汎用オーバーロード(と) が使用できることが保証されます。ただし、そうではありません。(§24.4.1 [string.view.synop] )。swap(T&, T&)
swap(T (&a)[N], T (&b)[N])
size/empty/data