Le intestazioni di libreria standard C++ possono includere l'un l'altro in modi non specificati, pertanto i programmatori in genere non dovrebbero dipendere da un'intestazione che include un'altra. In alcuni casi, tuttavia, un'intestazione è garantita per includere un'altra intestazione o per rendere disponibili alcune funzioni che altrimenti richiederebbero l'inclusione di un'altra intestazione. Quali sono quei casi?Quali intestazioni nella libreria standard C++ sono garantite per includere un'altra intestazione?
Quali intestazioni nella libreria standard C++ sono garantite per includere un'altra intestazione?
risposta
Questa risposta ignora le intestazioni C - sia le <meow.h>
sia le <cmeow>
. Dei ++ intestazioni di libreria C (tutti i riferimenti sono a N4659):
<initializer_list>
è garantito per essere incluso da:
<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>
è garantito per includere <ios>
, <streambuf>
, <istream>
, e <ostream>
(§30.4.1 [iostream.syn]).
<ios>
include <iosfwd>
(§30.5.1 [ios.syn]).
<bitset>
è garantito per includere <string>
e <iosfwd>
(§23.9.1 [bitset.syn]).
La funzione libera Modelli std::begin
, std::end
, i C++ 14 c-
, r-
e cr-
versioni, e C++ 17 modelli funzionali liberi std::size
, std::empty
e std::data
nominalmente risiedere in <iterator>
, ma sono anche disponibili se qualsiasi delle seguenti intestazioni è incluso: <array>
, <deque>
, <forward_list>
, <list>
, <map>
, <regex>
, <set>
, <string>
, <unordered_map>
, <unordered_set>
, e <vector>
(§27.7 [iterator.range], §27.8 [iterator.container]).
Quando <string_view>
è incluso, i *begin
e *end
funzioni e le due generici std::swap
sovraccarichi definiti [utility.swap] (swap(T&, T&)
e swap(T (&a)[N], T (&b)[N])
) sono garantiti per essere disponibile. size/empty/data
, tuttavia, non lo sono. (§24.4.1 [string.view.synop]).
@ShafikYaghmour L'unica differenza dopo aver confrontato N3337 e N4140 è la mancanza di 'std :: cbegin' ecc. In C++ 11. La maggior parte di questo è nella sinossi delle rispettive intestazioni. –
Perché queste informazioni sono utili? – Pradhan
@Pradhan È utile sapere, ad esempio, che se hai incluso '' non devi includere '', o '' se hai solo bisogno di 'std :: begin' /' std :: FINE'. –
Ah, ha senso. Grazie! – Pradhan