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::endC++14バージョンc-、r-およびcr-バージョン、および C++17 フリー関数テンプレートおよびstd::sizeは、名目上は にありますが、次のヘッダーのいずれかが含まれている場合にも使用できます: 、、、、、、、、、および( §27.7 [iterator.range]、§27.8 [iterator.container] )。std::emptystd::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