Библиотека
concepts
описывает компоненты библиотеки, которые программы на C++ могут использовать для проверки
аргументов шаблонов
на этапе компиляции и выполнения диспетчеризации функций на основе свойств типов.
Библиотека
строк
предоставляет поддержку для манипуляции текстом, представленным в виде однородных последовательностей следующих типов:
char
,
char8_t
(начиная с C++20)
,
char16_t
,
char32_t
(начиная с C++11)
,
wchar_t
, и любых других символьных типов.
Библиотека
numerics
предоставляет
numeric algorithms
и компоненты для работы с
complex number
, расширяющие поддержку численной обработки. Компонент
valarray
обеспечивает поддержку групповой обработки данных, потенциально реализуемой как параллельные операции на платформах с поддержкой такой обработки.
Компонент
random number
предоставляет средства для генерации псевдослучайных чисел.
(since C++11)
Библиотека ввода/вывода
предоставляет
компоненты iostream
, которые являются основным механизмом для ввода и вывода в программах на C++. Они могут использоваться вместе с другими элементами библиотеки, в частности со строками, локалями и итераторами.
Все элементы библиотеки, за исключением
operator new
и
operator delete
, определены в пространстве имен
std
или
пространствах имен
, вложенных в пространство имен
std
(за исключением элементов для средств стандартной библиотеки C, см. ниже).
Не указано, объявляются ли имена, объявленные в конкретном пространстве имен, непосредственно в этом пространстве имен или во
встроенном пространстве имен
внутри этого пространства имен.
(начиная с C++11)
Заголовки
Каждый элемент стандартной библиотеки C++ объявляется или определяется (где уместно) в
заголовочном файле
. Заголовочный файл не обязательно является исходным файлом, и последовательности, ограниченные
<
и
>
в именах заголовочных файлов, не обязательно являются допустимыми именами исходных файлов.
Стандартная библиотека C++ предоставляет
заголовки библиотеки C++
и
дополнительные заголовки C++ для средств библиотеки C
(см. страницу «
headers
» для описаний):
**Примечание:** В данном фрагменте HTML нет текста для перевода - все содержимое состоит из HTML-тегов, атрибутов и названий заголовочных файлов C++ внутри тегов ``, которые согласно инструкциям не подлежат переводу.
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык. Все содержимое состоит из:
- HTML тегов и атрибутов (не подлежат переводу)
- Названий заголовочных файлов C++ внутри тегов `` (не подлежат переводу согласно правилам)
- Атрибутов ссылок (также не подлежат переводу)
Если бы в коде присутствовал обычный текст вне указанных ограничений, он был бы переведен на русский язык с сохранением исходного форматирования.
**Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - все содержимое состоит из HTML-тегов, атрибутов и названий заголовочных файлов C++ внутри тегов ``, которые согласно инструкциям не подлежат переводу.
**Примечание:** В данном фрагменте HTML нет текста для перевода - все содержимое состоит из HTML-тегов, атрибутов и названий заголовочных файлов C++ (``, ``), которые согласно инструкциям не подлежат переводу.
**Примечание:** В данном HTML-фрагменте все содержимое находится внутри тегов `` (которые эквивалентны ``), поэтому согласно вашим инструкциям никакой текст не был переведен. Все заголовки C++ стандартных библиотек и HTML-разметка сохранены в оригинальном виде.
**Примечание:** В данном фрагменте HTML-кода весь текст, подлежащий переводу, уже находится внутри тегов `` (`` является устаревшим аналогом ``), поэтому согласно инструкциям перевод не выполняется. Все заголовки C++ стандартной библиотеки (``, ``, ``, ``, ``) и HTML-разметка сохранены без изменений.
**Примечание:** В данном фрагменте HTML отсутствует переводимый текст - все содержимое состоит из HTML-тегов, атрибутов и названия заголовочного файла C++ ``, который согласно инструкциям не подлежит переводу.
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык. Все содержимое состоит из:
- HTML тегов и атрибутов (которые не подлежат переводу)
- Названий заголовочных файлов C++ внутри тегов `` (которые являются C++ специфичными терминами и не переводятся)
- Пустых ячеек таблицы
Если бы в тексте присутствовали описательные элементы на английском (например, в атрибуте title или между тегами), они были бы переведены на русский с сохранением всех указанных требований.
**Примечание:** В данном фрагменте HTML-кода отсутствует текст для перевода на русский язык. Все содержимое состоит из:
- HTML тегов и атрибутов (которые не подлежат переводу)
- Названий заголовочных файлов C++ внутри тегов `` (которые являются C++ специфичными терминами и не переводятся)
- Атрибутов `title` с техническими путями (которые также не подлежат переводу)
Структура таблицы и все технические элементы сохранены в оригинальном виде в соответствии с требованиями.
**Примечание:** В данном HTML-фрагменте отсутствует текст для перевода - все содержимое состоит из HTML-тегов, атрибутов и названий заголовочных файлов C++ (внутри тегов ``), которые согласно инструкциям не подлежат переводу.
**Примечание:** В данном HTML-фрагменте не содержится переводимого текста - все элементы внутри тегов `` являются названиями заголовочных файлов C++, которые не подлежат переводу согласно требованиям. HTML-теги и атрибуты также сохранены в оригинальном виде.
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык. Все содержимое состоит из:
- HTML тегов и атрибутов (не подлежат переводу)
- Названий заголовочных файлов C++ внутри тегов `` (не подлежат переводу согласно правилам)
- Атрибутов `title` содержат технические термины C++ (не подлежат переводу)
Структура таблицы полностью сохранена в оригинальном формате.
**Примечание:** В данном HTML-фрагменте весь текст находится внутри тегов `` (которые являются частью тегов ``), поэтому согласно инструкциям перевода не требуется. Все C++ специфичные термины (названия заголовочных файлов) и HTML-разметка сохранены в оригинальном виде.
(начиная с 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
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
.
Единица трансляции может включать заголовок только вне любого объявления или определения и лексически до первой ссылки в этой единице трансляции на любую из сущностей, объявленных в этом заголовке. Диагностика не требуется.
Заголовки библиотеки C++
, или, для автономной реализации, подмножество таких заголовков, предоставляемых реализацией, в совокупности известны как
импортируемые заголовки библиотеки C++
.
Содержимое импортируемых заголовков библиотеки C++ становится доступным единице трансляции, когда она содержит соответствующее
объявление импорта
.
(since C++20)
Импорт модулей
Стандартная библиотека C++ предоставляет следующие
модули библиотеки C++
:
Именованный модуль
std.
compat
экспортирует те же объявления, что и именованный модуль
std
, и дополнительно экспортирует объявления в глобальном пространстве имен, соответствующие объявлениям в пространстве имен
std
, предоставляемым заголовками C++ для средств библиотеки C (например,
::fclose
).
оно обозначает одну и ту же
сущность
независимо от того, стало ли оно доступным через включение заголовка, импорт единицы заголовка или импорт модуля библиотеки C++.
Является ли имя из стандартной библиотеки C, объявленное с внешней линковкой, имеющим линковку
extern
"C"
или
extern
"C++"
— определяется реализацией. Стандарт C++ рекомендует использовать
extern
"C++"
в данном случае.
Объекты и функции, определенные в библиотеке и требуемые программой на C++, включаются в программу до запуска программы.
аннотацию другого заголовка, который, по-видимому, включен в аннотацию этого заголовка.
Для типов и макросов, определённых в нескольких заголовочных файлах (таких как
NULL
), включение любого количества этих заголовков в любом порядке никогда не нарушает
правило одного определения
.
Вызов сигнатуры нечленной функции стандартной библиотеки всегда приводит к фактическому вызову этой функции. Поэтому соответствующая реализация стандартной библиотеки не может определять дополнительные нечленные функции, которые могут быть вызваны корректной программой на C++.
Если не указано иное, вызовы, выполняемые функциями в стандартной библиотеке к не-операторным, не-членам функциям, не используют функции из другого
namespace
, которые обнаруживаются через
argument-dependent name lookup
.
Для каждого
объявления friend
функции (шаблона) внутри определения класса (шаблона) не предоставляется никакого другого объявления для этой функции (шаблона).
Сигнатуры функций стандартной библиотеки могут быть объявлены как
constexpr
только если они должны быть
constexpr
(libstdc++ cmath
здесь особенно не соответствует стандарту
). Если заголовок предоставляет любые неопределяющие объявления constexpr функций или конструкторов, соответствующие определения также должны быть предоставлены в этом заголовке.
Если не указано иное, каждая функция стандартной библиотеки должна соответствовать каждому из следующих требований для предотвращения
гонок данных
:
Функция стандартной библиотеки C++ не может (прямо или косвенно) обращаться к объектам, доступным потокам, отличным от текущего потока, если только эти объекты не доступны (прямо или косвенно) через аргументы функции, включая
this
.
Функция стандартной библиотеки C++ не может (прямо или косвенно) изменять объекты, доступные потокам, отличным от текущего потока, если только эти объекты не доступны (прямо или косвенно) через неконстантные аргументы функции, включая
this
.
Например, объект со статической продолжительностью хранения не может использоваться для внутренних целей без синхронизации, поскольку это может вызвать гонку данных даже в программах, которые не разделяют объекты между потоками явно.
Функция стандартной библиотеки C++ не может обращаться к объектам, косвенно доступным через её аргументы или через элементы её
контейнерных
аргументов, кроме как путём вызова функций, требуемых её спецификацией для этих элементов контейнера.
Операция над
итераторами
, полученными вызовом функции-члена контейнера или строки стандартной библиотеки, может обращаться, но не изменять базовый контейнер.
В частности, операции с контейнерами, которые инвалидируют итераторы, конфликтуют с операциями над итераторами, связанными с этим контейнером.
Функция стандартной библиотеки C++ может выполнять все операции исключительно в текущем потоке только если эти операции имеют эффекты,
видимые
пользователям.
Операции без видимых побочных эффектов могут быть распараллелены.
(начиная с 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
.
Спецификация исключений для невиртуальной функции может быть усилена добавлением небросающей спецификации исключений.
Усиление стандартной библиотеки
Реализация может быть
усиленной реализацией
, является ли реализация усиленной — определяется реализацией.
Некоторые функции-члены стандартной библиотеки (и шаблоны функций-членов) имеют
усиленные предусловия
. При вызове такой функции:
Если реализация защищённая, до любых других наблюдаемых побочных эффектов функции вычисляется одно или несколько
контрактных утверждений
с предикатами, описанными в защищённом предусловии, с проверяющей семантикой. Если любое из этих утверждений вычисляется с незавершающей семантикой и
обработчик нарушения контракта
возвращает управление, поведение не определено.
Если реализация не защищённая, при нарушении защищённого предусловия поведение не определено.
Функции с ужесточёнными предусловиями
- все перегрузки имеют ужесточённые предусловия
- некоторые перегрузки имеют ужесточённые предусловия
importstd;structStr:std::string// OK, std::string cannot be final{~Str();// Guaranteed to be noexcept};intmain(){std::puts("Hello stdlib!");// ::puts("Hello stdlib!"); // Requires std.compat module or stdio.h header// constexpr auto& void_info = std::any().type(); // std::any::type cannot be constexprstd::stringt;t=std::move(t);// OK, t is left in a valid (but unspecified) state}
Вывод:
Hello stdlib!
Отчёты о дефектах
Следующие отчеты о дефектах, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
идентификаторы, которые являются ключевыми словами или операторами в C++, могли
быть определены как макросы в заголовках стандартной библиотеки C++
(только
<ciso646>
требуется не определять их как макросы)
все заголовки стандартной
библиотеки C++ не могут
определять их как макросы