Стандартная библиотека 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++ заголовки для функций библиотеки 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++ определены в заголовках, содержимое которых становится доступным для трансляционной единицы, когда она содержит соответствующую директиву препроцессора #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++.
Подписи функций без указания имени никогда не объявляются с дополнительными стандартными аргументами.
Если не указано иное, вызовы, выполняемые функциями стандартной библиотеки для функций без указания имени, не являются операторами и не относятся к пространству имен, не используют функции из другого пространства имен, которые находятся посредством поиска имени, зависящего от аргументов.
Для каждого объявления друга функции (шаблона) внутри определения класса (шаблона) не предоставляется другое объявление для этой функции (шаблона).
| Подписи функций стандартной библиотеки могут быть объявлены только как constexpr, если они должны быть constexpr (libstdc++ cmath не соответствует стандарту в этом случае). Если заголовок предоставляет какие-либо не определяющие объявления constexpr-функций или конструкторов, соответствующие определения должны также предоставляться в этом заголовке. Если не указано иное, каждая функция стандартной библиотеки должна соответствовать следующим требованиям, чтобы предотвратить гонки данных:
| (с C++11) |
Для каждого класса, определённого в стандартной библиотеке C++, который должен быть производным от другого класса, определённого в стандартной библиотеке C++,
- базовый класс должен быть виртуальным, если он указан как virtual,
- базовый класс не может быть виртуальным, если он не указан как virtual, и
- если не указано иное, типы с различными именами являются различными типами.
| Если не указано иное, все типы, указанные в стандартной библиотеке C++, являются не-final типами. | (с 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++.
| 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