C++ Standard Library
Стандартная библиотека C++ предоставляет широкий спектр возможностей, пригодных для использования в стандартном C++.
Содержание |
Категория
Библиотека поддержки языка предоставляет компоненты, требуемые определёнными частями языка C++, такие как выделение памяти ( new / delete ) и обработка исключений .
|
Библиотека concepts описывает компоненты библиотеки, которые программы на C++ могут использовать для проверки аргументов шаблонов на этапе компиляции и выполнения диспетчеризации функций на основе свойств типов. |
(since C++20) |
Библиотека диагностики предоставляет единообразную структуру для сообщения об ошибках в программе на C++, включая предопределенные классы исключений .
Библиотека управления памятью предоставляет компоненты для управления памятью, включая умные указатели и scoped allocator (since C++11) .
|
Библиотека метапрограммирования описывает средства для использования в шаблонах и во время вычисления константных выражений, включая признаки типов , целочисленные последовательности , (начиная с C++14) и рациональную арифметику . |
(начиная с C++11) |
Библиотека общих утилит включает компоненты, используемые другими элементами библиотеки, такие как предопределённый распределитель памяти для управления динамической памятью, и компоненты, используемые как инфраструктура в программах на C++, такие как кортежи и (since C++11) обёртки функций .
Библиотеки контейнеров , итераторов , диапазонов (начиная с C++20) и алгоритмов предоставляют программе на C++ доступ к подмножеству наиболее широко используемых алгоритмов и структур данных.
Библиотека строк предоставляет поддержку для манипуляции текстом, представленным в виде однородных последовательностей следующих типов: char , char8_t (начиная с C++20) , char16_t , char32_t (начиная с C++11) , wchar_t , и любых других символьных типов.
Библиотека обработки текста предоставляет сопоставление и поиск регулярных выражений (since C++11) , утилиты для форматирования текста (since C++20) , идентификации кодировок текста (since C++26) и средства локализации .
Библиотека numerics предоставляет numeric algorithms и компоненты для работы с complex number , расширяющие поддержку численной обработки. Компонент valarray обеспечивает поддержку групповой обработки данных, потенциально реализуемой как параллельные операции на платформах с поддержкой такой обработки. Компонент random number предоставляет средства для генерации псевдослучайных чисел. (since C++11)
Библиотека времени предоставляет общеполезные утилиты для работы со временем.
Библиотека ввода/вывода предоставляет компоненты iostream , которые являются основным механизмом для ввода и вывода в программах на C++. Они могут использоваться вместе с другими элементами библиотеки, в частности со строками, локалями и итераторами.
|
Библиотека поддержки потоков предоставляет компоненты для создания и управления потоками, включая атомарные операции , взаимное исключение и межпоточное взаимодействие. |
(since C++11) |
|
Библиотека поддержки выполнения предоставляет фреймворк для управления асинхронным выполнением на общих ресурсах выполнения. |
(since C++26) |
Содержимое библиотеки
Стандартная библиотека C++ предоставляет определения для сущностей и макросов , описанных в синопсисах заголовков стандартной библиотеки C++ , если не указано иное.
Все элементы библиотеки, за исключением operator new и operator delete , определены в пространстве имен std или пространствах имен , вложенных в пространство имен std (за исключением элементов для средств стандартной библиотеки C, см. ниже). Не указано, объявляются ли имена, объявленные в конкретном пространстве имен, непосредственно в этом пространстве имен или во встроенном пространстве имен внутри этого пространства имен. (начиная с C++11)
Заголовки
Каждый элемент стандартной библиотеки C++ объявляется или определяется (где уместно) в
заголовочном файле
. Заголовочный файл не обязательно является исходным файлом, и последовательности, ограниченные
<
и
>
в именах заголовочных файлов, не обязательно являются допустимыми именами исходных файлов.
Стандартная библиотека C++ предоставляет заголовки библиотеки C++ и дополнительные заголовки C++ для средств библиотеки C (см. страницу « headers » для описаний):
| Заголовки библиотек C++ | ||||
|---|---|---|---|---|
| <algorithm> | <iomanip> | <list> | <ostream> | <streambuf> |
| <bitset> | <ios> | <locale> | <queue> | <string> |
| <complex> | <iosfwd> | <map> | <set> | <typeinfo> |
| <deque> | <iostream> | <memory> | <sstream> | <utility> |
| <exception> | <istream> | <new> | <stack> | <valarray> |
| <fstream> | <iterator> | <numeric> | <stdexcept> | <vector> |
| <functional> | <limits> | |||
| Заголовки, добавленные в C++11 | ||||
| <array> | <condition_variable> | <mutex> | <scoped_allocator> | <type_traits> |
| <atomic> | <forward_list> | <random> | <system_error> | <typeindex> |
| <chrono> | <future> | <ratio> | <thread> | <unordered_map> |
| <codecvt> | <initializer_list> | <regex> | <tuple> | <unordered_set> |
| Заголовки, добавленные в C++14 | ||||
| <shared_mutex> | ||||
| Заголовки, добавленные в C++17 | ||||
| <any> | <execution> | <memory_resource> | <string_view> | <variant> |
| <charconv> | <filesystem> | <optional> | ||
| Заголовки, добавленные в C++20 | ||||
| <barrier> | <concepts> | <latch> | <semaphore> | <stop_token> |
| <bit> | <coroutine> | <numbers> | <source_location> | <syncstream> |
| <compare> | <format> | <ranges> | <span> | <version> |
| Заголовки, добавленные в C++23 | ||||
| <expected> | <flat_set> | <mdspan> | <spanstream> | <stdfloat> |
| <flat_map> | <generator> | <print> | <stacktrace> | |
| Заголовки, добавленные в C++26 | ||||
| <contracts> | <hazard_pointer> | <inplace_vector> | <rcu> | <text_encoding> |
| <debugging> | <hive> | <linalg> | <simd> | |
| Удалённые заголовки | ||||
| <codecvt> | (начиная с C++11) (устарело в C++17) (удалено в C++26) | |||
| <strstream> | (устарело в C++98) (удалено в C++26) | |||
| Заголовки C++ для средств библиотеки C | ||||
|---|---|---|---|---|
| <cassert> | <clocale> | <cstdarg> | <cstring> | |
| <cctype> | <cmath> | <cstddef> | <ctime> | |
| <cerrno> | <csetjmp> | <cstdio> | <cwchar> | |
| <cfloat> | <csignal> | <cstdlib> | <cwctype> | |
| <climits> | ||||
| Заголовки, добавленные в C++11 | ||||
| <cfenv> | <cinttypes> | <cstdint> | <cuchar> | |
| Удалённые заголовки | ||||
| <ccomplex> | (начиная с C++11) (устарел в C++17) (удалён в C++20) | |||
| <ciso646> | (удалён в C++20) | |||
| <cstdalign> | (начиная с C++11) (устарел в C++17) (удалён в C++20) | |||
| <cstdbool> | (начиная с C++11) (устарел в C++17) (удалён в C++20) | |||
| <ctgmath> | (начиная с C++11) (устарел в C++17) (удалён в C++20) | |||
Автономная реализация имеет определяемый реализацией набор заголовков, смотрите здесь минимальные требования к набору заголовков.
Стандартная библиотека C
Стандартная библиотека C++ также предоставляет возможности стандартной библиотеки C, соответствующим образом адаптированные для обеспечения статической типобезопасности. Описания многих библиотечных функций опираются на стандартную библиотеку C для семантики этих функций.
В некоторых случаях сигнатуры, указанные в стандарте C++, могут отличаться от сигнатур в стандартной библиотеке C, и могут быть объявлены дополнительные перегрузки, но поведение и предусловия (включая те, что подразумеваются C-шным restrict ) (since C++17) остаются одинаковыми, если не указано иное.
Для совместимости со стандартной библиотекой C, стандартная библиотека C++ предоставляет перечисленные ниже заголовки C. Предназначение этих заголовков — только обеспечение взаимодействия. Возможно, что исходные файлы C++ должны включать один из этих заголовков, чтобы быть валидными ISO C. Исходные файлы, которые не предназначены для одновременной валидности как ISO C, не должны использовать какие-либо заголовки C. Смотрите здесь описания.
| Заголовки C | |||
|---|---|---|---|
| <assert.h> | <limits.h> | <stdarg.h> | <string.h> |
| <ctype.h> | <locale.h> | <stddef.h> | <time.h> |
| <errno.h> | <math.h> | <stdio.h> | <wchar.h> |
| <float.h> | <setjmp.h> | <stdlib.h> | <wctype.h> |
| <iso646.h> | <signal.h> | ||
| Заголовки, добавленные в C++11 | |||
| <complex.h> | <inttypes.h> | <stdbool.h> | <tgmath.h> |
| <fenv.h> | <stdalign.h> | <stdint.h> | <uchar.h> |
| Заголовки, добавленные в C++23 | |||
| <stdatomic.h> | |||
| Заголовки, добавленные в C++26 | |||
| <stdbit.h> | <stdchkint.h> | ||
Если не указано иное, содержимое каждого заголовка
c
xxx
совпадает с содержимым соответствующего заголовка
xxx
.h
как указано в
стандартной библиотеке C
. Однако в стандартной библиотеке C++ объявления (за исключением имён, определённых как макросы в C) находятся в области видимости пространства имён
std
. Не указано, объявляются ли эти имена (включая любые добавленные перегрузки) сначала в глобальной области видимости пространства имён, а затем внедряются в пространство имён
std
с помощью явных
using-объявлений
.
Имена, которые определены как макросы в C ( assert , offsetof , setjmp , va_arg , va_end и va_start ), должны быть определены как макросы в стандартной библиотеке C++, даже если C разрешает их реализацию в виде функций.
Имена, которые определены как функции в C, должны быть определены как функции в стандартной библиотеке C++. Это запрещает практику, разрешенную в C, предоставления маскирующего макроса в дополнение к прототипу функции. Единственный способ достичь эквивалентного инлайн-поведения в C++ — предоставить определение как extern inline function .
Идентификаторы, которые являются ключевыми словами или операторами в C++, не могут быть определены как макросы в заголовках стандартной библиотеки C++. В частности, включение стандартного заголовка <iso646.h> не имеет никакого эффекта.
Имена, связанные с безопасными функциями в стандартной C (начиная с C++17)
Если включен любой заголовок C++, определяется реализацией, объявляется ли любое из следующих имен стандарта C Приложения K в глобальном пространстве имен (ни одно из них не объявляется в пространстве имен std ):
Использование библиотеки
Подключение заголовочных файлов
Сущности в стандартной библиотеке C++ определены в заголовочных файлах, содержимое которых становится доступным единице трансляции при наличии соответствующей #include директивы препроцессора.
Единица трансляции может включать заголовки библиотек в любом порядке. Каждый может быть включен более одного раза, без какого-либо отличия от включения ровно один раз, за исключением того, что эффект включения либо <cassert> либо <assert.h> каждый раз зависит от лексически текущего определения NDEBUG .
Единица трансляции может включать заголовок только вне любого объявления или определения и лексически до первой ссылки в этой единице трансляции на любую из сущностей, объявленных в этом заголовке. Диагностика не требуется.
|
В модульных единицах , заголовки могут быть включены только в глобальных фрагментах модуля . |
(since C++20) |
Импорт заголовковЗаголовки библиотеки C++ , или, для автономной реализации, подмножество таких заголовков, предоставляемых реализацией, в совокупности известны как импортируемые заголовки библиотеки C++ . Содержимое импортируемых заголовков библиотеки C++ становится доступным единице трансляции, когда она содержит соответствующее объявление импорта . |
(since C++20) |
Импорт модулейСтандартная библиотека C++ предоставляет следующие модули библиотеки C++ :
Для каждого объявления в стандартной библиотеке,
|
(since C++23) |
Связывание
Сущности в стандартной библиотеке C++ имеют продолжительность хранения#внешняя связь . Если не указано иное, объекты и функции имеют связь по умолчанию extern "C++" linkage .
Является ли имя из стандартной библиотеки C, объявленное с внешней линковкой, имеющим линковку extern "C" или extern "C++" — определяется реализацией. Стандарт C++ рекомендует использовать extern "C++" в данном случае.
Объекты и функции, определенные в библиотеке и требуемые программой на C++, включаются в программу до запуска программы.
Требования к реализациям стандартной библиотеки
Гарантии
Заголовок C++ должен предоставлять объявления и определения , которые присутствуют в
- аннотацию этого заголовка, или
- аннотацию другого заголовка, который, по-видимому, включен в аннотацию этого заголовка.
Для типов и макросов, определённых в нескольких заголовочных файлах (таких как NULL ), включение любого количества этих заголовков в любом порядке никогда не нарушает правило одного определения .
Если не указано иное, все
объектоподобные макросы
определённые стандартной библиотекой C, которые раскрываются в целочисленные
константные выражения
могут использоваться в
#if
директивах препроцессора.
Вызов сигнатуры нечленной функции стандартной библиотеки всегда приводит к фактическому вызову этой функции. Поэтому соответствующая реализация стандартной библиотеки не может определять дополнительные нечленные функции, которые могут быть вызваны корректной программой на C++.
Сигнатуры нечленных функций никогда не объявляются с дополнительными аргументами по умолчанию .
Если не указано иное, вызовы, выполняемые функциями в стандартной библиотеке к не-операторным, не-членам функциям, не используют функции из другого namespace , которые обнаруживаются через argument-dependent name lookup .
Для каждого объявления friend функции (шаблона) внутри определения класса (шаблона) не предоставляется никакого другого объявления для этой функции (шаблона).
|
Сигнатуры функций стандартной библиотеки могут быть объявлены как constexpr только если они должны быть constexpr (libstdc++ cmath здесь особенно не соответствует стандарту ). Если заголовок предоставляет любые неопределяющие объявления constexpr функций или конструкторов, соответствующие определения также должны быть предоставлены в этом заголовке. Если не указано иное, каждая функция стандартной библиотеки должна соответствовать каждому из следующих требований для предотвращения гонок данных :
|
(начиная с C++11) |
Для каждого класса, определённого в стандартной библиотеке C++, который должен быть производным от другого класса, определённого в стандартной библиотеке C++,
- базовый класс должен быть виртуальным если он указан как virtual ,
- базовый класс не может быть виртуальным если он не указан как virtual , и
- если не указано иное, типы с различными именами должны быть различными типами.
|
Если не указано иное, все типы, указанные в стандартной библиотеке C++, являются не- final типами. |
(since C++11) |
Если функция, определённая в стандартной библиотеке C++, указана как выбрасывающая исключение (в определённой ситуации) заданного типа, то выброшенное исключение может иметь только этот тип или тип, унаследованный от него, чтобы обработчик исключений для базового типа мог его перехватить.
Функции из стандартной библиотеки C могут генерировать исключения только тогда, когда такая функция вызывает предоставленную программой функцию, которая генерирует исключение ( qsort() и bsearch() соответствуют этому условию).
Операции деструкторов, определенные в стандартной библиотеке C++, никогда не генерируют исключения. Каждый деструктор в стандартной библиотеке C++ ведет себя так, как если бы он имел спецификацию исключений без генерации .
|
Если функция в стандартной библиотеке C++ сообщает об ошибках через объект std::error_code , то член category() этого объекта должен возвращать std::system_category() для ошибок, происходящих из операционной системы, или ссылку на определяемую реализацией std::error_category для ошибок из других источников. Возможные значения value() для каждой из этих категорий ошибок должны быть определены. Объекты типов, определенных в стандартной библиотеке C++, могут быть перемещены . Операции перемещения могут быть явно указаны или неявно сгенерированы. Если не указано иное, такие объекты после перемещения будут находиться в допустимом, но неопределенном состоянии. Объект типа, определенного в стандартной библиотеке C++, может быть перемещён присваиванием в себя. Если не указано иное, такое присваивание переводит объект в допустимое, но неопределенное состояние. |
(начиная с C++11) |
Свобода реализации
Не указано, определены ли какие-либо функции-члены или не-члены в стандартной библиотеке C++ как inline .
Для не- виртуальной функции-члена стандартной библиотеки C++ может быть объявлен другой набор сигнатур функций-членов при условии, что любой вызов этой функции-члена, который выбрал бы перегрузку из данного набора объявлений, ведёт себя так, как если бы была выбрана эта перегрузка. Это позволяет, например:
- добавление параметров со значениями по умолчанию,
- замена функции-члена с аргументами по умолчанию двумя или более функциями-членами с эквивалентным поведением, или
- добавление дополнительных сигнатур для имени функции-члена.
Если не указано иное, определяется реализацией, какие функции в стандартной библиотеке C++ могут быть рекурсивно повторно входимыми.
|
Реализации стандартной библиотеки C++ могут совместно использовать свои внутренние объекты между потоками, если эти объекты не видны пользователям и защищены от состояний гонки данных. |
(since C++11) |
Не указано, является ли любая сигнатура функции или класс в стандартной библиотеке C++ дружественной для другого класса в стандартной библиотеке C++.
Имена и сигнатуры глобальных функций, описанные здесь , зарезервированы для реализации.
Любой класс в стандартной библиотеке C++ может быть унаследован от класса с именем, зарезервированным для реализации. Если класс, определённый в стандартной библиотеке C++, должен быть унаследован от других классов стандартной библиотеки C++, этот класс может быть унаследован напрямую от требуемого базового класса или косвенно через иерархию базовых классов с именами, зарезервированными для реализации.
Если функция, определённая в стандартной библиотеке C++, не указана как выбрасывающая исключения, но не имеет спецификации исключений без выброса, тип выбрасываемого исключения определяется реализацией, но должен быть std::exception или любым типом, производным от std::exception .
Спецификация исключений для невиртуальной функции может быть усилена добавлением небросающей спецификации исключений.
Усиление стандартной библиотекиРеализация может быть усиленной реализацией , является ли реализация усиленной — определяется реализацией. Некоторые функции-члены стандартной библиотеки (и шаблоны функций-членов) имеют усиленные предусловия . При вызове такой функции:
Функции-члены с усиленными предусловиями
|
(начиная с C++26) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Примечания
libstdc++ , libc++ и STL поддерживают использование модулей стандартной библиотеки в режиме C++20.
Отчёты о дефектах
Следующие отчеты о дефектах, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 1 | C++98 |
языковые связи имен из
стандартной библиотеки C не были указаны |
они являются
определяемыми реализацией |
| LWG 119 | C++98 |
спецификации исключений виртуальных
функций могли быть усилены |
разрешено только для
невиртуальных функций |
| LWG 147 | C++98 |
спецификация для нечленных
функций рассматривала только глобальные функции |
также рассматривает
негалобальные функции |
| LWG 225 | C++98 |
функции стандартной библиотеки могли вызывать нечленные функции
из других пространств имен из-за поиска, зависимого от аргументов |
запрещено, если не
указано иное |
| LWG 336 | C++98 | <strstream> не был заголовком библиотеки C++ | это заголовок библиотеки C++ |
| LWG 343 | C++98 | зависимости заголовков библиотеки не были указаны | указаны (перечислены в синопсисах) |
| LWG 456 | C++98 |
заголовки C++ для средств библиотеки C могли
предоставлять определения только в пространстве имен std |
разрешено определять в глобальном пространстве имен
и затем инжектировать в пространство имен std |
| LWG 465 | C++98 |
идентификаторы, которые являются ключевыми словами или операторами в C++, могли
быть определены как макросы в заголовках стандартной библиотеки C++ (только <ciso646> требуется не определять их как макросы) |
все заголовки стандартной
библиотеки C++ не могут определять их как макросы |
| LWG 1178 | C++98 |
заголовки C++ должны включать заголовок C++
содержащий любое необходимое определение |
заголовки C++ должны предоставлять объявления
и определения, которые прямо или косвенно включены в его синопсис |
| LWG 2013 | C++11 |
не было указано, могут ли функции, не
требуемые стандартом быть constexpr, быть объявлены constexpr стандартной библиотекой |
запрещено |
| LWG 2225 | C++98 |
требовалась диагностика, если заголовок
включается в неправильной позиции |
диагностика не
требуется в этом случае |