Spec-Zone.ru › C++

Стандартная библиотека C++

Стандартная библиотека 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), и алгоритмов обеспечивают программисту доступ к подмножеству наиболее часто используемых алгоритмов и структур данных.

Библиотека числовых операций предоставляет числовые алгоритмы и компоненты комплексных чисел, которые расширяют поддержку числовых вычислений. Компонент 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++
<algorithm> <iomanip> <list> <queue> <string>
<bitset> <ios> <locale> <set> <strstream>
<complex> <iosfwd> <map> <sstream> <typeinfo>
<deque> <iostream> <memory> <stack> <utility>
<exception> <istream> <new> <stdexcept> <valarray>
<fstream> <iterator> <numeric> <streambuf> <vector>
<functional> <limits> <ostream>
Заголовки, добавленные в 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
<debugging> <hazard_pointer> <linalg> <rcu> <text_encoding>
Удаленные заголовки
<codecvt> (с C++11)(устарело в C++17)(удалено в 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)(с 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++ — это предоставление определения как extern inline функции.

Идентификаторы, являющиеся ключевыми словами или операторами в C++, не могут быть определены как макросы в заголовках библиотеки стандартной C++. В частности, включение стандартного заголовка <iso646.h> не имеет никакого эффекта.

Имена, связанные с безопасными функциями в стандартной C (с C++17)

Если включён любой заголовок C++, то неопределено, объявляются ли в глобальном пространстве имён следующие имена из приложения К стандарта C (ни одно из них не объявляется в пространстве имён std):

Имена стандарта C Annex K
abort_handler_s mbstowcs_s strncat_s vswscanf_s
asctime_s memcpy_s strncpy_s vwprintf_s
bsearch_s memmove_s strtok_s vwscanf_s
constraint_handler_t memset_s swprintf_s wcrtomb_s
ctime_s printf_s swscanf_s wcscat_s
errno_t qsort_s tmpfile_s wcscpy_s
fopen_s RSIZE_MAX TMP_MAX_S wcsncat_s
fprintf_s rsize_t tmpnam_s wcsncpy_s
freopen_s scanf_s vfprintf_s wcsnlen_s
fscanf_s set_constraint_handler_s vfscanf_s wcsrtombs_s
fwprintf_s snprintf_s vfwprintf_s wcstok_s
fwscanf_s snwprintf_s vfwscanf_s wcstombs_s
gets_s sscanf_s vprintf_s wmemcpy_s
gmtime_s mbstowcs_s vscanf_s vswscanf_s
abort_handler_s strcat_s vsnprintf_s wmemmove
ignore_handler_s strcpy_s vsnwprintf_s wprintf_s
localtime_s strerrorlen_s vsprintf_s wscanf_s
L_tmpnam_s strerror_s vsscanf_s
mbsrtowcs_s strlen_s vswprintf_s

Использование библиотеки

Включение заголовков

Сущности в стандартной библиотеке C++ определены в заголовках, содержимое которых становится доступным для трансляционной единицы, когда она содержит соответствующую директиву препроцессора #include.

Трансляционная единица может включать заголовки библиотек в любом порядке. Каждый из них может быть включён более одного раза без изменения эффекта, кроме случаев включения <cassert> или <assert.h>, где эффект зависит от текущего определения NDEBUG.

Трансляционная единица может включать заголовок только вне любого объявления или определения и лексически перед первой ссылкой в этой трансляционной единице на любую из сущностей, объявленных в этом заголовке. Никакое диагностическое сообщение не требуется.

В модульных единицах, заголовки могут включаться только в глобальных фрагментах модулей.

(с C++20)

Импортирование заголовков

Заголовки библиотеки C++ или, для реализации свободной среды выполнения, подмножество таких заголовков, которые предоставляются реализацией, коллективно известны как импортируемые заголовки библиотеки C++.

Содержание импортируемых заголовков библиотеки C++ становится доступным для трансляционной единицы, когда она содержит соответствующее объявление импорта.

(с C++20)

Импортирование модулей

Стандартная библиотека C++ предоставляет следующие модули библиотеки C++:

  • Модуль с именем std экспортирует объявления в пространстве имён std, которые предоставляются импортируемыми заголовками C++ библиотеки (например, std::rotr из <bit>) и заголовками C++ для средств C (например, std::puts из <cstdio>). Он также экспортирует объявления в глобальное пространство имён для функций выделения памяти и освобождения памяти, предоставляемых <new> (например, ::operator new).
  • Модуль с именем std.compat экспортирует те же объявления, что и модуль с именем std, а также экспортирует объявления в глобальное пространство имён, соответствующие объявлениям в пространстве имён std , которые предоставляются заголовками C++ для средств C (например, ::fclose).

Для каждого объявления в стандартной библиотеке,

  • модуль, к которому оно присоединено, не определён, и
  • оно обозначает тот же объект независимо от того, был ли он сделан доступным путём включения заголовка, импортирования блока заголовка или импортирования модуля библиотеки C++.
Макрокоманда проверки функции Значение Std Функция
__cpp_lib_modules 202207L (C++23) Модули стандартной библиотеки std и std.compat
(с C++23)

Связь

Объекты в стандартной библиотеке C++ имеют внешнюю связь. Если не указано иное, объекты и функции имеют стандартную extern "C++" связь.

Определяется ли имя из стандартной библиотеки C, объявленное с внешней связью, как extern "C" или extern "C++" - определяется реализацией. Стандарт C++ рекомендует использовать extern "C++" в этом случае.

Объекты и функции, определённые в библиотеке и требуемые программой C++, включаются в программу до запуска программы.

Требования к реализациям стандартной библиотеки

Гарантии

Заголовок C++ должен предоставить объявления и определения, которые появляются в

  • синтаксисе этого заголовка, или
  • синтаксисе другого заголовка, который, по-видимому, включён в синтаксис этого заголовка.

Для типов и макрокоманд, определённых в нескольких заголовках (например, NULL), включение любого количества этих заголовков в любом порядке никогда не нарушает правило одного определения.

Если не указано иное, все макрокоманды типа объекта, определённые стандартной библиотекой C, которые расширяются до целочисленных константных выражений, могут использоваться в #if директивах предварительной обработки.

Вызов стандартной библиотеки без указания имени функции всегда приводит к фактическому вызову этой функции. Поэтому соответствующая реализация стандартной библиотеки не может определить дополнительные функции без указания имени, которые могут быть вызваны корректной программой C++.

Подписи функций без указания имени никогда не объявляются с дополнительными стандартными аргументами.

Если не указано иное, вызовы, выполняемые функциями стандартной библиотеки для функций без указания имени, не являются операторами и не относятся к пространству имен, не используют функции из другого пространства имен, которые находятся посредством поиска имени, зависящего от аргументов.

Для каждого объявления друга функции (шаблона) внутри определения класса (шаблона) не предоставляется другое объявление для этой функции (шаблона).

Подписи функций стандартной библиотеки могут быть объявлены только как constexpr, если они должны быть constexpr (libstdc++ cmath не соответствует стандарту в этом случае). Если заголовок предоставляет какие-либо не определяющие объявления constexpr-функций или конструкторов, соответствующие определения должны также предоставляться в этом заголовке.

Если не указано иное, каждая функция стандартной библиотеки должна соответствовать следующим требованиям, чтобы предотвратить гонки данных:

  • Функция стандартной библиотеки C++ не может (прямо или косвенно) обращаться к объектам, доступным для потоков, отличных от текущего потока, за исключением случаев, когда к объектам обращаются (прямо или косвенно) через аргументы функции, включая this.
  • Функция стандартной библиотеки C++ не может (прямо или косвенно) изменять объекты, доступные для потоков, отличных от текущего потока, за исключением случаев, когда к объектам обращаются (прямо или косвенно) через неконстантные аргументы функции, включая this.
    • Например, объект со статической продолжительностью хранения не может использоваться во внутренних целях без синхронизации, так как это может привести к гонке данных даже в программах, которые явно не совместно используют объекты между потоками.
  • Функция стандартной библиотеки C++ не может обращаться к объектам, косвенно доступным через её аргументы или через элементы её контейнеров, за исключением вызова функций, требуемых её спецификацией для этих элементов контейнера.
  • Операция над итераторами, полученными путём вызова функции-члена контейнера или строки стандартной библиотеки, может обращаться, но не изменять, к лежащему в основе контейнеру.
    • В частности, операции над контейнерами, которые делают итераторы недействительными, конфликтуют с операциями над итераторами, связанными с этим контейнером.
  • Функция стандартной библиотеки C++ может выполнять все операции только в текущем потоке, если эти операции имеют эффекты, которые видимы пользователям.
    • Операции без видимых побочных эффектов могут быть распараллелены.
(с 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++.

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 стандартной библиотекой
запрещено

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/standard_library

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API