Стандартная библиотека C++
Стандартная библиотека C++ предоставляет широкий набор средств, доступных в стандартном C++.
Категория
Библиотека поддержки языка предоставляет компоненты, необходимые для определённых частей языка C++, таких как выделение памяти (new/delete) и обработка исключений.
| Библиотека концепций описывает компоненты библиотеки, которые программы на C++ могут использовать для проверки аргументов шаблонов во время компиляции и выбора функций на основе свойств типов. | (начиная с C++20) |
Библиотека диагностики предоставляет единообразную основу для сообщения об ошибках в программе на C++, включая предопределённые классы исключений.
Библиотека управления памятью предоставляет компоненты для управления памятью, включая умные указатели и ограниченный аллокатор(начиная с C++11).
| Библиотека метапрограммирования описывает средства, применяемые в шаблонах и при вычислении константных выражений, включая характеристики типов, последовательности целых чисел,(начиная с C++14) и рациональную арифметику. | (начиная с C++11) |
Библиотека утилит общего назначения включает компоненты, используемые другими элементами библиотеки, например предопределённый аллокатор хранилища для управления динамическим хранилищем, а также компоненты, используемые в качестве инфраструктуры в программах на C++, например кортежи и(начиная с C++11) обёртки функций.
Библиотеки контейнеров, итераторов, диапазонов(начиная с C++20) и алгоритмов предоставляют программам на C++ доступ к некоторому набору наиболее часто используемых алгоритмов и структур данных.
Библиотека строк предоставляет средства для работы с текстом, представленным однородными последовательностями следующих типов: char, char8_t(начиная с C++20), char16_t, char32_t(начиная с C++11), wchar_t и любых других типов, подобных символьным.
Библиотека обработки текста предоставляет средства для сопоставления и поиска с помощью регулярных выражений(начиная с C++11), утилиты для форматирования текста(начиная с C++20) и определения кодировок текста(начиная с C++26), а также средства локализации.
Библиотека числовых операций предоставляет числовые алгоритмы и компоненты для работы с комплексными числами, расширяющие возможности числовой обработки. Компонент valarray предоставляет средства для обработки по n элементов за раз, которая потенциально может реализовываться как параллельные операции на платформах, поддерживающих такую обработку. Компонент генерации случайных чисел предоставляет средства для генерации псевдослучайных чисел.(начиная с C++11)
Библиотека времени предоставляет универсальные средства для работы со временем.
Библиотека ввода-вывода предоставляет компоненты iostream, являющиеся основным механизмом ввода и вывода данных в программах на C++. Их можно использовать с другими элементами библиотеки, в частности со строками, локалями и итераторами.
| Библиотека поддержки потоков предоставляет компоненты для создания потоков и управления ими, включая атомарные операции, взаимное исключение и межпоточное взаимодействие. | (начиная с C++11) |
| Библиотека поддержки выполнения предоставляет основу для управления асинхронным выполнением на универсальных ресурсах выполнения. | (начиная с C++26) |
Содержимое библиотеки
Стандартная библиотека C++ предоставляет определения для сущностей и макросов, описанных в кратких изложениях заголовков стандартной библиотеки C++, если не указано иное.
Все сущности библиотеки, кроме operator new и operator delete, определены в пространстве имён std или в пространствах имён, вложенных в пространство имён std (за исключением сущностей средств стандартной библиотеки C, см. ниже).Не указано, объявляются ли имена, объявленные в определённом пространстве имён, непосредственно в нём или во встраиваемом пространстве имён внутри него.(начиная с C++11)
Заголовки
Каждый элемент стандартной библиотеки C++ объявляется или определяется (в зависимости от ситуации) в заголовке. Заголовок не обязательно является исходным файлом, а последовательности, ограниченные < и > в именах заголовков, не обязательно являются допустимыми именами исходных файлов.
Стандартная библиотека C++ предоставляет заголовки библиотеки C++ и дополнительные заголовки C++ для средств библиотеки C (описания см. на странице «заголовки):
| Заголовки 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, а также могут объявляться дополнительные перегрузки, но поведение и предусловия (включая подразумеваемые restrict в C)(начиная с 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> |
<stdckdint.h> | ||
Если не указано иное, содержимое каждого заголовка cxxx совпадает с содержимым соответствующего заголовка xxx.h, описанного в стандартной библиотеке C. Однако в стандартной библиотеке C++ объявления (за исключением имён, определённых в C как макросы) находятся в области пространства имён std. Не указано, объявляются ли эти имена (включая добавленные перегрузки) сначала в глобальной области пространства имён, а затем вводятся в пространство имён std посредством явных объявлений using.
Имена, определённые в C как макросы (assert, offsetof, setjmp, va_arg, va_end и va_start), должны быть определены как макросы в стандартной библиотеке C++, даже если стандарт C допускает их реализацию в виде функций.
Имена, определённые в C как функции, должны быть определены как функции в стандартной библиотеке C++. Это запрещает практику, допустимую в C, когда помимо прототипа функции предоставляется макрос, подменяющий её. Единственный способ обеспечить эквивалентное поведение встраивания в C++ — предоставить определение в виде внешней встраиваемой функции.
Идентификаторы, являющиеся ключевыми словами или операторами в C++, нельзя определять как макросы в заголовках стандартной библиотеки C++. В частности, включение стандартного заголовка <iso646.h> не оказывает никакого эффекта.
Имена, связанные с безопасными функциями в стандартном C (начиная с C++17)
Если включён любой заголовок C++, определяется реализацией, объявляется ли какое-либо из следующих имён из приложения K стандарта C в глобальном пространстве имён (ни одно из них не объявляется в пространстве имён std):
Использование библиотеки
Подключение заголовков
Сущности стандартной библиотеки C++ определены в заголовках; их содержимое становится доступным единице трансляции, когда она содержит соответствующую препроцессорную директиву #include.
Единица трансляции может подключать заголовки библиотеки в любом порядке. Каждый заголовок можно подключать несколько раз без эффекта, отличного от его однократного подключения, за исключением того, что эффект подключения <cassert> или <assert.h> каждый раз зависит от лексически текущего определения NDEBUG.
Единица трансляции может подключать заголовок только вне любого объявления или определения и лексически до первого обращения в этой единице трансляции к любой сущности, объявленной в этом заголовке. Диагностика не требуется.
| В модульных единицах заголовки можно подключать только в глобальных фрагментах модуля. | (начиная с C++20) |
Импорт заголовковЗаголовки библиотеки C++ или, для свободно стоящей реализации, подмножество таких заголовков, предоставляемое реализацией, в совокупности называются импортируемыми заголовками библиотеки C++. Содержимое импортируемых заголовков библиотеки C++ становится доступным единице трансляции, когда она содержит соответствующее объявление импорта. | (начиная с C++20) |
Импорт модулейСтандартная библиотека C++ предоставляет следующие модули библиотеки C++:
Для каждого объявления стандартной библиотеки:
| (начиная с C++23) |
Связывание
Сущности стандартной библиотеки C++ имеют длительность хранения#внешнее связывание. Если не указано иное, объекты и функции имеют связывание по умолчанию extern"C++".
Связывание имён из стандартной библиотеки C, объявленных с внешним связыванием, — extern"C" или extern"C++" — определяется реализацией. Стандарт C++ рекомендует в этом случае использовать extern"C++".
Объекты и функции, определённые в библиотеке и необходимые программе на C++, включаются в программу до её запуска.
Требования к реализациям стандартной библиотеки
Гарантии
Заголовок C++ должен предоставлять объявления и определения, содержащиеся в:
- сводке этого заголовка; или
- сводке другого заголовка, который, по-видимому, подключается в сводке этого заголовка.
Для типов и макросов, определённых в нескольких заголовках (например, NULL), подключение любого количества этих заголовков в любом порядке никогда не нарушает правило одного определения.
Если не указано иное, все объектоподобные макросы, определённые стандартной библиотекой C и раскрывающиеся в целочисленные константные выражения, можно использовать в директивах препроцессора #if.
Вызов сигнатуры нестатической функции стандартной библиотеки всегда приводит к фактическому вызову этой функции. Поэтому соответствующая стандарту реализация стандартной библиотеки не может определять дополнительные нестатические функции, которые может вызвать допустимая программа на C++.
Сигнатуры нестатических функций никогда не объявляются с дополнительными аргументами по умолчанию.
Если не указано иное, вызовы нестандартных операторов и нестатических функций из функций стандартной библиотеки не используют функции из другого пространства имён, найденные с помощью поиска имён, зависящего от аргументов.
Для каждого объявления friend функции (шаблона) внутри определения класса (шаблона) никакого другого объявления этой функции (шаблона) не предоставляется.
| Сигнатуры функций стандартной библиотеки можно объявлять как constexpr, только если они обязаны быть constexpr (libstdc++ cmath в этом отношении явно не соответствует стандарту). Если заголовок предоставляет какие-либо не определяющие функции или конструкторы constexpr, соответствующие определения также должны предоставляться в этом заголовке. Если не указано иное, каждая функция стандартной библиотеки должна удовлетворять следующим требованиям, чтобы предотвращать состояния гонки:
| (начиная с C++11) |
Для каждого класса, определённого в стандартной библиотеке C++ и обязанного быть производным от другого класса, определённого в стандартной библиотеке C++:
- базовый класс должен быть виртуальным, если он указан как virtual;
- базовый класс не может быть виртуальным, если он не указан как virtual; и
- если не указано иное, типы с различными именами должны быть различными типами.
| Если не указано иное, все типы, указанные в стандартной библиотеке C++, являются не-финальными. | (начиная с C++11) |
Если указано, что функция, определённая в стандартной библиотеке C++, выбрасывает исключение (в определённой ситуации) заданного типа, выброшенное исключение может иметь только этот тип или производный от него тип, чтобы обработчик исключений для базового типа мог его перехватить.
Функции стандартной библиотеки C могут выбрасывать исключения только в тех случаях, когда такая функция вызывает предоставленную программой функцию, выбрасывающую исключение (qsort() и bsearch() удовлетворяют этому условию).
Операции деструкторов, определённых в стандартной библиотеке C++, никогда не выбрасывают исключения. Каждый деструктор стандартной библиотеки C++ ведёт себя так, как если бы для него была задана спецификация исключений без выбрасывания.
| Если функция стандартной библиотеки C++ сообщает об ошибках с помощью объекта Объекты типов, определённых в стандартной библиотеке C++, можно перемещать. Операции перемещения могут быть явно указаны или неявно сгенерированы. Если не указано иное, такие перемещённые объекты переводятся в допустимое, но не специфицированное состояние. Объект типа, определённого в стандартной библиотеке C++, можно переместить самому себе. Если не указано иное, такое присваивание переводит объект в допустимое, но не специфицированное состояние. | (начиная с C++11) |
Свобода реализации
Не определено, определены ли какие-либо функции-члены или нестатические функции стандартной библиотеки C++ как inline.
Для невиртуальной функции-члена стандартной библиотеки C++ можно объявить другой набор сигнатур функций-членов при условии, что любой вызов этой функции-члена, который выбрал бы перегрузку из заданного набора объявлений, ведёт себя так, как если бы была выбрана эта перегрузка. Это, например, позволяет:
- добавлять параметры с аргументами по умолчанию;
- заменять функцию-член с аргументами по умолчанию двумя или более функциями-членами с эквивалентным поведением; или
- добавлять дополнительные сигнатуры для имени функции-члена.
Если не указано иное, выбор функций стандартной библиотеки C++, которые могут быть рекурсивно повторно вызваны, определяется реализацией.
| Реализации стандартной библиотеки C++ могут совместно использовать собственные внутренние объекты между потоками, если эти объекты не видны пользователям и защищены от состояний гонки. | (начиная с C++11) |
Не определено, является ли какая-либо сигнатура функции или класс стандартной библиотеки C++ другом другого класса стандартной библиотеки C++.
Имена и сигнатуры глобальных функций, описанные здесь, зарезервированы для реализации.
Любой класс стандартной библиотеки C++ может быть унаследован от класса с именем, зарезервированным для реализации. Если класс, определённый в стандартной библиотеке C++, обязан наследоваться от других классов стандартной библиотеки C++, он может наследоваться непосредственно от требуемого базового класса или косвенно через иерархию базовых классов с именами, зарезервированными для реализации.
Если для функции, определённой в стандартной библиотеке C++, не указано, что она выбрасывает исключение, но для неё не задана спецификация исключений без выбрасывания, тип выброшенного исключения определяется реализацией, однако он должен быть std::exception или типом, производным от std::exception.
Спецификацию исключений невиртуальной функции можно усилить, добавив спецификацию исключений без выбрасывания.
Усиление защиты стандартной библиотекиРеализация может быть защищённой реализацией ; является ли реализация защищённой, определяется реализацией. Для некоторых функций стандартной библиотеки (и шаблонов функций) заданы защищённые предусловия . При вызове такой функции:
Функции с защищёнными предусловиями
| (начиная с C++26) |
Примечания
Пример
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(); // any::type cannot be constexpr
std::string p, q;
q = std::move(p); // OK, p is left in a valid (but unspecified) state
// This includes self move assignment q = std::move(q)
// return EXIT_SUCCESS; // Macro EXIT_SUCCESS is not provided by either stdlib module
}
Вывод:
Hello stdlib!
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроспективно применены к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| 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 | требовалось диагностическое сообщение, если заголовок включён в неправильном месте | в этом случае диагностическое сообщение не требуется |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/standard_library