2014-10-28 2 views
31

Die Header der C++ - Standardbibliothek können sich auf nicht spezifizierte Weise gegenseitig umfassen, so dass Programmierer im Allgemeinen nicht von einer Kopfzeile einschließlich einer anderen abhängig sein sollten. In einigen Fällen wird jedoch garantiert, dass ein Header einen anderen Header enthält, oder bestimmte Funktionen verfügbar machen, die andernfalls die Aufnahme eines anderen Headers erfordern würden. Was sind diese Fälle?Welche Header in der C++ - Standardbibliothek enthalten garantiert einen weiteren Header?

+3

Warum sind diese Informationen nützlich? – Pradhan

+4

@Pradhan Es ist nützlich zu wissen, dass, wenn Sie '' 'enthalten, Sie' 'oder' 'nicht brauchen, wenn Sie nur' std :: begin'/'std :: brauchen Ende. –

+1

Ah, macht Sinn. Vielen Dank! – Pradhan

Antwort

32

Diese Antwort ignoriert C-Header - sowohl die <meow.h> als auch die.. Von dem C++ Bibliothek Header (alle Angaben beziehen sich auf N4659):

<initializer_list> garantiert durch einbezogen werden:

<iostream> garantiert <ios>, <streambuf>, <istream> und <ostream> (§30.4.1 [iostream.syn]) aufzunehmen.

<ios> enthält garantiert <iosfwd> (§30.5.1 [ios.syn]).

<bitset> wird garantiert <string> und <iosfwd> (§23.9.1 [bitset.syn]) enthalten.

Die freie Funktionsschablonen std::begin, std::end, die C++ 14 c-, r- und cr- Versionen und die C++ 17 frei Funktionsschablonen std::size, std::empty und std::data nominell in <iterator> residieren, sondern sind auch verfügbar, wenn irgendwelche die folgenden Header enthalten ist: <array>, <deque>, <forward_list>, <list>, <map>, <regex>, <set>, <string>, <unordered_map>, <unordered_set> und <vector> (§27.7 [iterator.range], §27.8 [iterator.container]).

Wenn <string_view> enthalten ist, die *begin und *end Funktionen und die beiden generischen std::swap definiert Überlastungen in [utility.swap] (swap(T&, T&) und swap(T (&a)[N], T (&b)[N])) sind garantiert zur Verfügung stehen. size/empty/data sind jedoch nicht. (§24.4.1 [string.view.synop]).

+0

@ShafikYaghmour Der einzige Unterschied nach dem Vergleich von N3337 und N4140 ist das Fehlen von 'std :: cbegin' usw. in C++ 11. Das meiste davon befindet sich in der Übersicht für die jeweiligen Header. –

Verwandte Themen