C++ Standard Library
Die C++-Standardbibliothek bietet eine breite Palette von Einrichtungen, die im standardkonformen C++ verwendbar sind.
Inhaltsverzeichnis
KategorieDie Sprachunterstützungsbibliothek bietet Komponenten, die von bestimmten Teilen der C++-Sprache benötigt werden, wie Speicherallokation ( new / delete ) und Ausnahmebehandlung .
Die Diagnosebibliothek bietet einen einheitlichen Rahmen zur Fehlerberichterstattung in C++-Programmen, einschließlich vordefinierter Ausnahmeklassen . Die Speicherverwaltungsbibliothek bietet Komponenten zur Speicherverwaltung, einschließlich Smart Pointern und Scoped Allocator (seit C++11) .
Die Allgemeine Hilfsbibliothek enthält Komponenten, die von anderen Bibliothekselementen verwendet werden, wie einen vordefinierten Speicher-Allokator für die dynamische Speicherverwaltung, und Komponenten, die als Infrastruktur in C++-Programmen dienen, wie Tupel und (seit C++11) Funktionswrapper . Die Container , Iteratoren , Ranges (seit C++20) und Algorithmen -Bibliotheken bieten einem C++-Programm Zugriff auf eine Auswahl der am weitesten verbreiteten Algorithmen und Datenstrukturen. Die String-Bibliothek bietet Unterstützung für die Manipulation von Text, der als homogene Sequenzen der folgenden Typen dargestellt wird: char , char8_t (seit C++20) , char16_t , char32_t (seit C++11) , wchar_t , und alle anderen zeichenähnlichen Typen. Die Textverarbeitungsbibliothek bietet Regex-Matching und -Suche (seit C++11) , Hilfsmittel für Textformatierung (seit C++20) , Textkodierungsidentifikation (seit C++26) und Lokalisierungsfunktionen . Die Numerik-Bibliothek bietet numerische Algorithmen und Komplexe-Zahlen -Komponenten, die die Unterstützung für numerische Verarbeitung erweitern. Die valarray -Komponente bietet Unterstützung für n-auf-einmal-Verarbeitung, die potenziell als parallele Operationen auf Plattformen implementiert ist, die solche Verarbeitung unterstützen. Die Zufallszahlen-Komponente bietet Einrichtungen zur Erzeugung von Pseudozufallszahlen. (seit C++11) Die Zeitbibliothek bietet allgemein nützliche Zeitfunktionen. Die Input/Output-Bibliothek stellt die iostream-Komponenten bereit, die den primären Mechanismus für die Eingabe und Ausgabe von C++-Programmen darstellen. Sie können mit anderen Elementen der Bibliothek verwendet werden, insbesondere mit Strings, Locales und Iteratoren.
BibliotheksinhaltDie C++-Standardbibliothek stellt Definitionen für die Entitäten und Makros bereit, die in den Übersichten der C++-Standardbibliothek-Header beschrieben sind, sofern nicht anders angegeben. Alle Bibliotheksentitäten außer operator new und operator delete sind innerhalb des Namensraums std oder in Namensräumen definiert, die innerhalb des Namensraums std geschachtelt sind (mit Ausnahme der Entitäten für die C-Standardbibliothekseinrichtungen, siehe unten). Es ist nicht spezifiziert, ob Namen, die in einem bestimmten Namensraum deklariert werden, direkt in diesem Namensraum oder in einem Inline-Namensraum innerhalb dieses Namensraums deklariert werden. (seit C++11) Header
Jedes Element der C++-Standardbibliothek wird in einem
Header
deklariert oder definiert (je nach Anwendungsfall). Ein Header ist nicht notwendigerweise eine Quelldatei, noch sind die durch
Die C++-Standardbibliothek stellt die C++-Bibliotheksheader und zusätzliche C++-Header für C-Bibliotheksfunktionen bereit (siehe " headers "-Seite für Beschreibungen):
Eine freestanding implementation hat einen implementierungsdefinierten Satz von Headern, siehe hier für die Mindestanforderungen an den Satz von Headern. C-StandardbibliothekDie C++-Standardbibliothek stellt auch die Einrichtungen der C-Standardbibliothek zur Verfügung, entsprechend angepasst um statische Typsicherheit zu gewährleisten. Die Beschreibungen vieler Bibliotheksfunktionen stützen sich auf die C-Standardbibliothek für die Semantik dieser Funktionen. In einigen Fällen können die in Standard C++ spezifizierten Signaturen von den Signaturen in der C-Standardbibliothek abweichen, und zusätzliche Überladungen können deklariert werden, aber das Verhalten und die Vorbedingungen (einschließlich jener, die durch C's restrict impliziert werden) (seit C++17) sind gleich, sofern nicht anders angegeben. Aus Gründen der Kompatibilität mit der C-Standardbibliothek stellt die C++-Standardbibliothek die unten aufgeführten C-Header bereit. Diese Header sind nur für Interoperabilität gedacht. Es ist möglich, dass C++-Quelldateien einen dieser Header einbinden müssen, um gültiger ISO-C-Code zu sein. Quelldateien, die nicht gleichzeitig gültiger ISO-C-Code sein sollen, sollten keine der C-Header verwenden. Siehe hier für Beschreibungen.
Sofern nicht anders angegeben, entspricht der Inhalt jedes Headers
Namen, die in C als Makros definiert sind ( assert , offsetof , setjmp , va_arg , va_end und va_start ) müssen in der C++-Standardbibliothek als Makros definiert sein, selbst wenn C die Implementierung als Funktionen erlaubt. Namen, die in C als Funktionen definiert sind, müssen in der C++-Standardbibliothek als Funktionen definiert werden. Dies verbietet die in C erlaubte Praxis, zusätzlich zum Funktionsprototypen ein maskierendes Makro bereitzustellen. Die einzige Möglichkeit, äquivalentes Inline-Verhalten in C++ zu erreichen, ist die Bereitstellung einer Definition als externe inline-Funktion . Bezeichner, die Schlüsselwörter oder Operatoren in C++ sind, können in C++-Standardbibliotheksheadern nicht als Makros definiert werden. Insbesondere hat das Einbinden der Standardheader-Datei <iso646.h> keine Auswirkung. Namen assoziiert mit sicheren Funktionen im Standard C (seit C++17)Wenn irgendein C++-Header eingebunden wird, ist implementierungsdefiniert, ob einer der folgenden C-Standard-Annex-K-Namen im globalen Namensraum deklariert wird (keiner davon wird im Namensraum std deklariert): Verwendung der BibliothekHeader-Dateien einbindenDie Entitäten in der C++-Standardbibliothek sind in Headern definiert, deren Inhalte einer Translation Unit verfügbar gemacht werden, wenn sie die entsprechende #include Präprozessor-Direktive enthält. Eine Übersetzungseinheit kann Bibliotheksheader in beliebiger Reihenfolge einbinden. Jeder Header kann mehr als einmal eingebunden werden, wobei dies keinen anderen Effekt hat als das einmalige Einbinden, außer dass der Effekt des Einbindens von entweder <cassert> oder <assert.h> jedes Mal von der lexikalisch aktuellen Definition von NDEBUG abhängt. Eine Übersetzungseinheit kann einen Header nur außerhalb jeglicher Deklaration oder Definition und lexikalisch vor der ersten Referenz in dieser Übersetzungseinheit auf eine der in diesem Header deklarierten Entitäten einbinden. Es ist keine Diagnose erforderlich.
VerknüpfungEntitäten in der C++-Standardbibliothek haben storage duration#external linkage . Sofern nicht anders angegeben, haben Objekte und Funktionen standardmäßig extern "C++" linkage . Ob ein Name aus der C-Standardbibliothek, der mit externer Verknüpfung deklariert ist, extern "C" oder extern "C++" Verknüpfung besitzt, ist implementierungsdefiniert. Der C++-Standard empfiehlt in diesem Fall die Verwendung von extern "C++" . Objekte und Funktionen, die in der Bibliothek definiert sind und von einem C++ Programm benötigt werden, werden vor dem Programmstart in das Programm eingebunden. Anforderungen an Standardbibliothek-ImplementierungenGarantienEin C++-Header muss Deklarationen und Definitionen bereitstellen, die darin erscheinen
Für Typen und Makros, die in mehreren Headern definiert sind (wie z.B. NULL ), verletzt das Inkludieren beliebig vieler dieser Header in beliebiger Reihenfolge niemals die One Definition Rule .
Sofern nicht anders angegeben, können alle
objektähnlichen Makros
der C-Standardbibliothek, die zu ganzzahligen
konstanten Ausdrücken
expandieren, in
Das Aufrufen einer Standardbibliothek-Nicht-Mitgliedsfunktionssignatur führt immer dazu, dass tatsächlich diese Funktion aufgerufen wird. Daher kann eine konforme Standardbibliotheksimplementierung keine zusätzlichen Nicht-Mitgliedsfunktionen definieren, die von einem gültigen C++-Programm aufgerufen werden könnten. Nicht-Member-Funktionssignaturen werden niemals mit zusätzlichen Default Arguments deklariert. Sofern nicht anders angegeben, verwenden Aufrufe durch Funktionen in der Standardbibliothek an Nicht-Operator-, Nicht-Member-Funktionen keine Funktionen aus einem anderen namespace , die durch argument-dependent name lookup gefunden werden. Für jede friend-Deklaration einer Funktion (Template) innerhalb einer Klassen-(Template-)Definition wird keine weitere Deklaration für diese Funktion (Template) bereitgestellt.
Für jede Klasse, die in der C++-Standardbibliothek definiert ist und von einer anderen in der C++-Standardbibliothek definierten Klasse abgeleitet werden muss,
Wenn eine Funktion in der C++-Standardbibliothek spezifiziert ist, eine Exception (in einer bestimmten Situation) eines gegebenen Typs zu werfen, kann die geworfene Exception nur diesen Typ oder einen davon abgeleiteten Typ haben, sodass ein Exception-Handler für den Basistyp sie abfangen kann. Funktionen aus der C-Standardbibliothek können nur dann Ausnahmen werfen, wenn eine solche Funktion eine programmseitig bereitgestellte Funktion aufruft, die eine Ausnahme wirft ( qsort() und bsearch() erfüllen diese Bedingung). Destruktoroperationen, die in der C++-Standardbibliothek definiert sind, werfen niemals Ausnahmen aus. Jeder Destruktor in der C++-Standardbibliothek verhält sich so, als hätte er eine nicht-werfende Ausnahmespezifikation .
ImplementierungsfreiheitEs ist nicht spezifiziert, ob irgendwelche Member- oder Non-Member-Funktionen in der C++-Standardbibliothek als inline definiert sind. Für eine nicht- virtuelle C++ Standardbibliothek-Memberfunktion kann ein anderer Satz von Memberfunktionssignaturen deklariert werden, vorausgesetzt, dass jeder Aufruf dieser Memberfunktion, der eine Überladung aus dem gegebenen Satz von Deklarationen auswählen würde, sich so verhält, als ob diese Überladung ausgewählt worden wäre. Dies erlaubt beispielsweise:
Sofern nicht anders angegeben, ist implementierungsdefiniert, welche Funktionen in der C++-Standardbibliothek rekursiv wieder eintretbar sein können.
Es ist nicht spezifiziert, ob irgendeine Funktionssignatur oder Klasse in der C++-Standardbibliothek ein Freund einer anderen Klasse in der C++-Standardbibliothek ist. Die hier beschriebenen Namen und globalen Funktionssignaturen hier sind für die Implementierung reserviert. Jede Klasse in der C++-Standardbibliothek kann von einer Klasse mit einem für die Implementierung reservierten Namen abgeleitet werden. Wenn eine in der C++-Standardbibliothek definierte Klasse von anderen Klassen in der C++-Standardbibliothek abgeleitet werden muss, kann diese Klasse direkt von der erforderlichen Basisklasse oder indirekt über eine Hierarchie von Basisklassen mit für die Implementierung reservierten Namen abgeleitet werden. Wenn eine Funktion in der C++-Standardbibliothek nicht als Ausnahme werfend spezifiziert ist, aber keine nicht-werfende Ausnahmespezifikation besitzt, ist die geworfene Ausnahme implementierungsdefiniert, jedoch sollte ihr Typ std::exception oder ein davon abgeleiteter Typ sein. Die Ausnahmespezifikation für eine nicht-virtuelle Funktion kann durch Hinzufügen einer nicht-werfenden Ausnahmespezifikation verstärkt werden.
Hinweiselibstdc++ , libc++ und STL unterstützen alle die Verwendung von Standardbibliotheksmodulen im C++20-Modus. BeispielDiesen Code ausführen import std;
struct Str : std::string // OK, std::string cannot be final
{
~Str(); // Guaranteed to be noexcept
};
int main()
{
std::puts("Hello stdlib!");
// ::puts("Hello stdlib!"); // Requires std.compat module or stdio.h header
// constexpr auto& void_info = std::any().type(); // std::any::type cannot be constexpr
std::string t;
t = std::move(t); // OK, t is left in a valid (but unspecified) state
}
Ausgabe: Hello stdlib!
FehlerberichteDie folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||