В этом подпункте описаны соглашения, используемые для определения стандартной библиотеки C ++. [structure] описывает структуру нормативных разделов [language.support] через [thread] и Приложение [depr]. [conventions] описывает другие редакционные соглашения.
Каждое предложение библиотеки содержит следующие элементы, если применимо:155
Резюме
Требования
Подробные характеристики
Ссылки на стандартную библиотеку C
Для экономии места элементы, не относящиеся к пункту, опускаются. Например, если в разделе не указаны какие-либо требования, подпункта «Требования» не будет.
Резюме предоставляет синопсис категории и вводит подпункты первого уровня. В каждом подпункте также приводится сводка, в которой перечислены заголовки, указанные в подпункте, и объекты библиотеки, представленные в каждом заголовке.
Пункты, помеченные «Примечание (и):» или «Пример (ы):», являются информативными, остальные параграфы являются нормативными.
Требования описывают ограничения, которым должна соответствовать программа C ++, расширяющая стандартную библиотеку. Такие расширения обычно являются одним из следующих:
Аргументы шаблона
Производные классы
Контейнеры, итераторы и алгоритмы, соответствующие соглашению об интерфейсе
Компоненты string и iostream используют явное представление операций, требуемых от аргументов шаблона. Они используют шаблон класса char_traits для определения этих ограничений.
Требования соглашения об интерфейсе сформулированы как можно более широко. Вместо того , заявив , что «класс X должен определить функцию - член operator++()», интерфейс требует «для любого объекта x класса X, ++x определяется». То есть, является ли оператор членом, не указано.
Требования сформулированы в виде четко определенных выражений, которые определяют действительные термины типов, удовлетворяющих требованиям. Для каждого набора четко определенных требований к выражениям существует таблица, в которой указывается начальный набор допустимых выражений и их семантика. Любой общий алгоритм (пункт [algorithms]), который использует четко определенные требования к выражениям, описывается в терминах допустимых выражений для параметров его типа шаблона.
В некоторых случаях семантические требования представлены в виде кода C ++. Такой код предназначен как спецификация эквивалентности конструкции другой конструкции, не обязательно как способ реализации этой конструкции.156
Хотя в некоторых случаях приведенный код однозначно является оптимальной реализацией.
Подробные спецификации содержат следующие элементы:
название и краткое описание
синопсис (определение класса или объявление функции, в зависимости от ситуации)
ограничения на аргументы шаблона, если таковые имеются
описание инвариантов классов
описание семантики функции
Описания функций-членов класса следуют в следующем порядке (при необходимости):157
конструктор (ы) и деструктор
функции копирования, перемещения и присвоения
функции сравнения
функции-модификаторы
функции наблюдателя
операторы и другие функции, не являющиеся членами
Описание семантики функции содержит следующие элементы (при необходимости):158
Requires: предварительные условия для вызова функции
Effects: действия, выполняемые функцией
Synchronization: операции синхронизации ([intro.multithread]), применимые к функции
Postconditions: наблюдаемые результаты, установленные функцией
Returns: описание значений, возвращаемых функцией
Throws: любые исключения, созданные функцией, и условия, которые могут вызвать исключение
Complexity: временная и / или пространственная сложность функции
Remarks: дополнительные семантические ограничения на функцию
Error conditions: условия ошибок для кодов ошибок, сообщаемых функцией
Каждый раз, когда Effects элемент указывает, что семантика некоторой функции F представляет собой Equivalent to некоторую кодовую последовательность, различные элементы интерпретируются следующим образом. Если Fсемантика определяет Requires элемент, то это требование логически налагается до equivalent-to семантики. Далее, семантика кодовой последовательности определяется Requires, Effects, Synchronization, Postconditions, Returns, Throws, Complexity, Remarks, и Error conditions указана для функциональных вызовов , содержащихся в кодовой последовательности. Значение, возвращаемое из F , определяется элементом F's Returns , или, если F не имеет Returns элемента,void невозврат из F задается return операторами в кодовой последовательности. Если Fсемантика содержит элемент Throws, Postconditionsили Complexity , то он заменяет любые вхождения этого элемента в кодовой последовательности.
Для незарезервированных функций замены и обработчика Clause [language.support] определяет два поведения для рассматриваемых функций: их обязательное поведение и поведение по умолчанию. default behavior Описывает определение функции , предоставляемой реализации. required behavior Описывает семантику определения функции , представленное либо реализации или программой C ++. Если в описании не делается явных различий, описанное поведение является обязательным.
Если формулировка требования сложности требует отрицательного числа операций, фактическое требование - нулевое количество операций.159
Требования к сложности, указанные в разделах библиотеки, являются верхними границами, и реализации, которые обеспечивают более высокие гарантии сложности, удовлетворяют этим требованиям.
Условия ошибки определяют условия, при которых функция может выйти из строя. Условия перечислены вместе с подходящим объяснением как enum class errc константы ([syserr]).
Для экономии места элементы, не относящиеся к классу, опускаются. Например, если в классе не указаны какие-либо функции сравнения, подпункта «Функции сравнения» не будет.
Для экономии места элементы, не относящиеся к функции, опускаются. Например, если функция не определяет никаких дополнительных предварительных условий, Requires: абзаца не будет .
В некоторых случаях это упрощает представление требований к сложности.
В этом подпункте описывается несколько редакционных соглашений, используемых для описания содержимого стандартной библиотеки C ++. Эти соглашения предназначены для описания implementation-defined types, и member functions.
Подпункты Требования могут описывать имена, которые используются для определения ограничений для аргументов шаблона.160 Эти имена используются в разделах библиотеки для описания типов, которые могут быть предоставлены в качестве аргументов программой C ++ при создании экземпляров компонентов шаблона из библиотеки.
Некоторые типы, определенные в разделе [input.output] , используются для описания типов, определяемых реализацией. Они основаны на других типах, но с дополнительными ограничениями.
Примеры из [utility.requirements] включают в себя: EqualityComparable, LessThanComparable, CopyConstructible. Примеры [iterator.requirements] включают: InputIterator, ForwardIterator.
Несколько типов , определенных в пунктах [language.support] через [thread] и Приложение [depr] , которые используются в качестве параметров функции или возврата типов определяются для целей изложения только для того , чтобы захватить их языковую связь. За объявлениями таких типов следует комментарий, оканчивающийся на exposition only. [ Example:
namespace std { extern "C" using some-handler = int(int, void*, double); // exposition only }
Заполнитель типа some-handler теперь можно использовать для указания функции, которая принимает параметр обратного вызова с привязкой к языку C. ] — end example
Существует несколько типов , определенных в пункте [input.output] являются enumerated types. Каждый перечислимый тип может быть реализован как перечисление или как синоним перечисления.161
Перечислимый тип enumerated можно записать:
enum enumerated { \textit{V}0, \textit{V}1, \textit{V}2, \textit{V}3, ..... }; inline const \textit{enumerated C}0(\textit{V}0); inline const \textit{enumerated C}1(\textit{V}1); inline const \textit{enumerated C}2(\textit{V}2); inline const \textit{enumerated C}3(\textit{V}3); .....
Здесь имена \textit{C}0, \textit{C}1и т.д. , представляют enumerated elements для этого конкретного перечислимого типа. Все такие элементы имеют разные значения.
Например, целочисленный тип с постоянными целочисленными значениями ([basic.fundamental]).
Несколько типов , определенных в пунктах [language.support] через [thread] и Дополнением [depr] являются bitmask types. Каждый тип битовой маски может быть реализован как перечислимый тип, который перегружает определенные операторы, как целочисленный тип или как bitset.
Тип битовой маски bitmask можно записать:
// For exposition only. // int_type is an integral type capable of representing all values of the bitmask type. enum bitmask : int_type { \textit{V}0 = 1 << 0, \textit{V}1 = 1 << 1, \textit{V}2 = 1 << 2, \textit{V}3 = 1 << 3, ..... }; inline constexpr \textit{bitmask C}0(\textit{V}0); inline constexpr \textit{bitmask C}1(\textit{V}1); inline constexpr \textit{bitmask C}2(\textit{V}2); inline constexpr \textit{bitmask C}3(\textit{V}3); ..... constexpr bitmask operator&(bitmask X, bitmask Y) { return static_cast<bitmask>( static_cast<int_type>(X) & static_cast<int_type>(Y)); } constexpr bitmask operator|(bitmask X, bitmask Y) { return static_cast<bitmask>( static_cast<int_type>(X) | static_cast<int_type>(Y)); } constexpr bitmask operator^(bitmask X, bitmask Y){ return static_cast<bitmask>( static_cast<int_type>(X) ^ static_cast<int_type>(Y)); } constexpr bitmask operator~(bitmask X){ return static_cast<bitmask>(~static_cast<int_type>(X)); } bitmask& operator&=(bitmask& X, bitmask Y){ X = X & Y; return X; } bitmask& operator|=(bitmask& X, bitmask Y) { X = X | Y; return X; } bitmask& operator^=(bitmask& X, bitmask Y) { X = X ^ Y; return X; }
Здесь имена \textit{C}0, \textit{C}1и т.д. , представляют bitmask elements для этого конкретного типа Bitmask. Все такие элементы имеют различные ненулевые значения, такие что для любой пары \textit{C}i и \textit{C}j где i≠j, Ci & Ci отличен от нуля и Ci & Cj равен нулю. Кроме того, значение 0 используется для представления объекта empty bitmask, в котором не установлены элементы битовой маски.
Следующие термины применяются к объектам и значениям типов битовых масок:
Чтобы set получить значение Y в объекте X , нужно оценить выражение X |= Y.
Чтобы clear получить значение Y в объекте X , нужно оценить выражение X &= ~Y.
Значение Y is set в объекте, X если выражение не X & Y равно нулю.
Стандартная библиотека C широко использует символы и последовательности символов, которые следуют нескольким единым соглашениям:
A letter - это любая из 26 строчных или 26 прописных букв в базовом наборе символов выполнения.
Это decimal-point character (однобайтовый) символ, используемый функциями, которые преобразуют (однобайтовую) последовательность символов в значение одного из типов с плавающей запятой. Он используется в последовательности символов для обозначения начала дробной части. Оно представлено в пунктах [language.support] через [thread] и Приложении [depr] периодом, '.', который также его значение в "C" местности, но может изменяться во время выполнения программы с помощью вызова setlocale(int, const char*),162 или путем изменения к locale объекту, как это описано в пунктах [locales] и [input.output].
character sequence Является , array object A что может быть объявлено как T A[N], где T любой из типов char, unsigned charили signed char ([basic.fundamental]), необязательно квалифицирован по любой комбинации const или volatile. Начальные элементы массива имеют определенное содержимое вплоть до элемента, определенного некоторым предикатом. Последовательность символов может быть обозначена значением указателя S , указывающим на ее первый элемент.
A null-terminated byte stringили ntbs - это последовательность символов, элемент с самым высоким адресом и определенным содержимым которой имеет нулевое значение ( terminating null символ); ни один другой элемент в последовательности не имеет нулевого значения.163
length А. Н. НТБ является количество элементов , которые предшествуют завершающий нулевой символ. An НТБ имеет нулевую длину.empty
value А.Н. НТБ представляет собой последовательность значений элементов до и включая завершающий нулевой символ.
Многие из объектов, которыми манипулируют сигнатуры функций, объявленные в, <cstring> являются последовательностями символов или ntbs . Размер некоторых из этих последовательностей символов ограничен значением длины, которое поддерживается отдельно от последовательности символов.
Строковый литерал, например "abc", является статическим ntbs .
A null-terminated multibyte string, или ntmbs , представляет собой ntbs, который составляет последовательность допустимых многобайтовых символов, начинающуюся и заканчивающуюся в начальном состоянии сдвига.165
An НТБ , который содержит только символы из базового набора символов исполнения также является ntmbs . В этом случае каждый многобайтовый символ состоит из одного байта.
Ради изложения Морозы [language.support] через [thread] и приложение [depr] не описывают копирование / перемещение конструкторов, оператор присваивания, или (невиртуальные) деструкторы с той же самой очевидной семантикой, которые могут быть получены по умолчанию ([class.ctor], [class.dtor], [class.copy]). Не указано, предоставляет ли реализация явные определения для таких сигнатур функций-членов или для виртуальных деструкторов, которые могут быть сгенерированы по умолчанию.
Ради наглядности в предложениях библиотеки конструкторы иногда аннотируются с помощью EXPLICIT. Такой конструктор условно объявляется как явный или неявный ([class.conv.ctor]). [ Note: Обычно это реализуется путем объявления двух таких конструкторов, максимум один из которых участвует в разрешении перегрузки. ] — end note
Пункты [language.support] до [thread] и Приложение [depr] не определяют представление классов и намеренно опускают спецификацию class members. Реализация может определять статические или нестатические члены класса, или и то, и другое, по мере необходимости для реализации семантики функций-членов, указанных в разделах [language.support] по [thread] и в приложении [depr].
В целях пояснения некоторые подпункты предоставляют репрезентативные объявления и семантические требования для частных членов классов, которые соответствуют внешним спецификациям классов. За объявлениями для таких членов следует комментарий, который заканчивается exposition onlyследующим образом:
streambuf* sb; // exposition only