Стандартная Библиотека С++
Стандартная библиотека C++ предоставляет широкий спектр возможностей, которые можно использовать в стандартном C++.
Содержание |
[править] Категория
Библиотека поддержки языка предоставляет компоненты, необходимые для определённых частей языка C++, например выделения памяти (new/delete) и обработки исключений.
Библиотека концептов описывает библиотечные компоненты, которые программы C++ могут использовать для проверки во время компиляции аргументов шаблона и выполнения диспетчеризации функций на основе свойств типов. |
(начиная с C++20) |
Библиотека диагностики обеспечивает согласованную основу для сообщения об ошибках в программе C++, включая предопределённые классы исключений.
Библиотека управления памятью предоставляет компоненты для управления памятью, в том числе умные указатели и распределитель с областью видимости (начиная с C++11).
Библиотека метапрограммирования описывает средства для использования в шаблонах и во время константной оценки, включая свойства типа, целочисленную последовательность (начиная с C++14) и рациональную арифметику. |
(начиная с C++11) |
Библиотека общих утилит включает компоненты, используемые другими элементами библиотеки, такими как предопределённый распределитель памяти для динамического управления памятью, а также компоненты, используемые в качестве инфраструктуры в программах на C++, например кортежи и (начиная с C++11) обёртки функций.
Библиотека строк поддерживает работу с текстом, представленным в виде однородных последовательностей следующих типов: char, char8_t (начиная с C++20), char16_t, char32_t (начиная с C++11), wchar_t и любых других символьных типов.
Библиотеки контейнеров, итераторов, диапазонов (начиная с C++20) и алгоритмов предоставляют программе C++ доступ к подмножеству наиболее широко используемых алгоритмов и структур данных.
Библиотека числовых значений предоставляет компоненты числовых алгоритмов и комплексных чисел, которые расширяют поддержку обработки чисел. Компонент valarray обеспечивает поддержку обработки n одновременно, что потенциально может быть реализовано как параллельные операции на платформах, поддерживающих такую обработку. Компонент случайных чисел предоставляет средства для генерации псевдослучайных чисел. (начиная с C++11)
Библиотека времени предоставляет полезные утилиты времени.
Библиотека локализации обеспечивает расширенную поддержку интернационализации для обработки текста.
Библиотека ввода/вывода предоставляет компоненты iostream, которые являются основным механизмом ввода и вывода программ C++. Их можно использовать с другими элементами библиотеки, в частности со строками, локалями и итераторами.
Библиотека регулярных выражений обеспечивает сопоставление и поиск регулярных выражений. Библиотека поддержки потоков предоставляет компоненты для создания потоков и управления ими, включая атомарные операции, взаимное исключение и взаимодействие между потоками. |
(начиная с C++11) |
[править] Содержимое библиотеки
Стандартная библиотека 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++20 | |||
<ciso646> | |||
Заголовки, добавленные в C++11 | |||
<cfenv> | <cinttypes> | <cstdint> | <cuchar> |
Заголовки, добавленные в C++11, устаревшие в C++17 и удалённые в C++20 | |||
<ccomplex> | <cstdalign> | <cstdbool> | <ctgmath> |
Автономная реализация имеет набор заголовков, определяемый реализацией, минимальные требования к набору заголовков смотрите здесь.
[править] Стандартная библиотека 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> |
Если не указано иное, содержимое каждого заголовка 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++" сязывание.
Наличие связывания extern "C" или extern "C++" у имени из стандартной библиотеки C, объявленной с внешним связыванием, определяется реализацией. Стандарт C++ рекомендует использовать в этом случае extern "C++".
Объекты и функции, определённые в библиотеке и требуемые программой на C++, включаются в программу до её запуска.
[править] Требования к реализации стандартной библиотеки
[править] Гарантии
Заголовок C++ должен содержать объявления и определения, которые появляются в
- кратком обзоре этого заголовка или
- кратком обзоре другого заголовка, который, по-видимому, включен в краткий обзор этого заголовка.
Для типов и макросов, определённых в нескольких заголовках (например, NULL), включение любого количества этих заголовков в любом порядке никогда не нарушает правило одного определения.
Если не указано иное, все объектоподобные макросы, определённые стандартной библиотекой C, которые расширяются до целочисленных константных выражений , могут использоваться в #if
директивы предварительной обработки.
Вызов сигнатуры функции, не являющейся элементом стандартной библиотеки, всегда приводит к фактическому вызову этой функции. Поэтому соответствующая реализация стандартной библиотеки не может определять дополнительные функции, не являющиеся элементами, которые могут вызываться допустимой программой C++.
Сигнатуры функций, не являющихся элементами, никогда не объявляются с дополнительными аргументами по умолчанию.
Если не указано иное, вызовы функций из стандартной библиотеки вызывающих функции, не являющиеся операторами и не являющиеся элементами, не используют функции из другого пространства имён, найденные с помощью поиска имени в зависимости от аргумента.
Для каждого дружественного объявления функции (шаблона) в определении класса (шаблона) для этой функции (шаблона) не предусмотрено никакого другого объявления.
Сигнатуры функций стандартной библиотеки могут быть объявлены как constexpr, только если они должны быть constexpr (libstdc++ cmath явно не соответствует этим требованиям). Если заголовок предоставляет какие-либо неопределяющие объявления функций или конструкторов constexpr, соответствующие определения также должны быть предоставлены в этом заголовке. Если не указано иное, каждая функция стандартной библиотеки должна соответствовать каждому из следующих требований для предотвращения гонок данных:
|
(начиная с C++11) |
Для каждого класса, определённого в стандартной библиотеке C++, необходимо, чтобы он был производным от другого класса, определённого в стандартной библиотеке C++,
- базовый класс должен быть виртуальным, если он указан как virtual,
- базовый класс не может быть виртуальным, если он не указан как virtual, и
- если не указано иное, типы с разными именами должны быть отдельными типами.
Если не указано иное, все типы, указанные в стандартной библиотеке C++, не являются типами final. |
(начиная с 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++ могут совместно использовать свои внутренние объекты между потоками, если объекты не видны пользователям и защищены от гонок данных. |
(начиная с C++11) |
Не указано, является ли какая-либо сигнатура функции или класс в стандартной библиотеке C++ другом другого класса в стандартной библиотеке C++.
Имена и сигнатуры глобальных функций, описанные здесь, зарезервированы для реализации.
Любой класс в стандартной библиотеке C++ может быть наследован от класса с именем, зарезервированным для реализации. Если класс, определённый в стандартной библиотеке C++, должен быть производным от других классов стандартной библиотеки C++, этот класс может быть производным непосредственно от требуемого базового класса или косвенно через иерархию базовых классов с именами, зарезервированными для реализации.
Если функция, определённая в стандартной библиотеке C++, не указана как генерирующая исключения, но не имеет спецификацию исключения, не вызывающую исключение, создаваемое исключение определяется реализацией, но его тип должен быть std::exception или любым типом, производный от std::exception.
Спецификацию исключений для невиртуальных функций можно усилить, добавив спецификацию исключений, не вызывающую генерацию исключений.
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
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 стандартной библиотекой |
запрещено |