20 Library introduction [library]

20.5 Library-wide requirements [requirements]

20.5.4 Constraints on programs [constraints]

20.5.4.1 Overview [constraints.overview]

В этом разделе описаны ограничения для программ C ++, использующих возможности стандартной библиотеки C ++. Следующие подпункты определяют ограничения на использование программойnamespaces, ее использование различныхreserved names, ее использованиеheaders, ее использование стандартных библиотечных классов в качестве базовых классов ([derived.classes]), ее определенияreplacement functionsи ее установкуhandler functions во время выполнения.

20.5.4.2 Namespace use [namespace.constraints]

20.5.4.2.1 Namespace std [namespace.std]

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

Поведение программы на C ++ не определено, если она объявляет

  • явная специализация любой функции-члена шаблона класса стандартной библиотеки, или

  • явная специализация любого шаблона функции-члена стандартного библиотечного класса или шаблона класса, или

  • явная или частичная специализация любого шаблона класса-члена стандартного библиотечного класса или шаблона класса, или

  • руководство по вычету для любого стандартного шаблона класса библиотеки.

Программа может явно создать экземпляр шаблона, определенного в стандартной библиотеке, только в том случае, если объявление зависит от имени определяемого пользователем типа и создание экземпляра соответствует требованиям стандартной библиотеки для исходного шаблона.

Единица трансляции не должна объявлять пространство именstd как встроенное пространство имен ([namespace.def]).

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

20.5.4.2.2 Namespace posix [namespace.posix]

Поведение программы C ++ не определено, если она добавляет объявления или определения в пространство имен posix или в пространство имен в пространстве имен, posix если не указано иное. Пространство именposix зарезервировано для использования ISO / IEC 9945 и другими стандартами POSIX.

20.5.4.2.3 Namespaces for future standardization [namespace.future]

Пространства имен верхнего уровня с именем, начинающимся сstd непустой последовательности цифр и за которым следует непустая последовательность цифр, зарезервированы для будущей стандартизации. Поведение программы C ++ не определено, если она добавляет объявления или определения в такое пространство имен. [ Example: Пространство имен верхнего уровняstd2 зарезервировано для использования в будущих версиях настоящего стандарта. ]end example

20.5.4.3 Reserved names [reserved.names]

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

  • макросы

  • глобальные имена

  • имена с внешней связью

Если программа объявляет или определяет имя в контексте, в котором оно зарезервировано, кроме случаев, явно разрешенных этим пунктом, ее поведение не определено.

20.5.4.3.1 Zombie names [zombie.names]

В пространстве именstdследующие имена зарезервированы для предыдущей стандартизации:

20.5.4.3.2 Macro names [macro.names]

Единица трансляции, которая включает заголовок стандартной библиотеки, не должна#define или не #undef объявляется в каком-либо заголовке стандартной библиотеки.

Единица перевода не должна#define или не должна быть#undef лексически идентична ключевым словам, идентификаторам, перечисленным в Таблице4, или attribute-tokens описанным в[dcl.attr].

20.5.4.3.3 External linkage [extern.names]

Каждое имя, объявленное как объект с внешней связью в заголовке, зарезервировано для реализации, чтобы обозначить этот объект библиотеки с внешней связью 177 как в пространстве имен, так std и в глобальном пространстве имен.

Каждая глобальная сигнатура функции, объявленная с внешней связью в заголовке, зарезервирована для реализации, чтобы обозначить эту сигнатуру функции с внешней связью.178

Каждое имя из стандартной библиотеки C, объявленное с внешней связью , зарезервировано для реализации для использования в качестве имени со связью как в пространстве имен, так и в глобальном пространстве имен.extern "C"std

Каждая сигнатура функции из стандартной библиотеки C, объявленной с внешней связью, зарезервирована для реализации для использования в качестве сигнатуры функции с обоими extern "C" и extern "C++" связью179 или как имя области пространства имен в глобальном пространстве имен.

Список таких зарезервированных имен включает errno, объявлен или определен в .<cerrno>

Список таких зарезервированных сигнатур функций с внешней связью включает setjmp(jmp_­buf), объявленные или определенные в , и , объявленные или определенные в .<csetjmp>va_­end(va_­list)<cstdarg>

Сигнатуры функций, объявленные в , и всегда зарезервированы, несмотря на ограничения, наложенные в подпункте 4.5.1 Поправки 1 к Стандарту C для этих заголовков.<cuchar><cwchar><cwctype>

20.5.4.3.4 Types [extern.types]

Для каждого типа T из стандартной библиотеки C180 типы ​::​T и std​::​T зарезервированы для реализации и, если они определены, ​::​T должны быть идентичны std​::​T.

Эти типы clock_­t, div_­t, FILE, fpos_­t, lconv, ldiv_­t, mbstate_­t, ptrdiff_­t, sig_­atomic_­t, size_­t, time_­t, tm, va_­list, wctrans_­t, wctype_­t, и wint_­t.

20.5.4.3.5 User-defined literal suffixes [usrlit.suffix]

Literal suffix identifiers которые не начинаются с подчеркивания, зарезервированы для будущей стандартизации.

20.5.4.4 Headers [alt.headers]

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

20.5.4.5 Derived classes [derived.classes]

Сигнатуры виртуальных функций-членов, определенные для базового класса в стандартной библиотеке C ++, могут быть переопределены в производном классе, определенном в программе ( ).[class.virtual]

20.5.4.6 Replacement functions [replacement.functions]

Пункты[language.support] до[thread] и Приложение[depr] описывают поведение множества функций, определенных стандартной библиотекой C ++. Однако при некоторых обстоятельствах некоторые из этих описаний функций также применимы к функциям замены, определенным в программе ([definitions]).

Программа на C ++ может предоставить определение для любой из следующих сигнатур функции распределения динамической памяти, объявленных в header <new> ([basic.stc.dynamic],[support.dynamic]):

operator new(std::size_t)
operator new(std::size_t, std::align_val_t)
operator new(std::size_t, const std::nothrow_t&)
operator new(std::size_t, std::align_val_t, const std::nothrow_t&)

operator delete(void*)
operator delete(void*, std::size_t)
operator delete(void*, std::align_val_t)
operator delete(void*, std::size_t, std::align_val_t)
operator delete(void*, const std::nothrow_t&)
operator delete(void*, std::align_val_t, const std::nothrow_t&)

operator new[](std::size_t)
operator new[](std::size_t, std::align_val_t)
operator new[](std::size_t, const std::nothrow_t&)
operator new[](std::size_t, std::align_val_t, const std::nothrow_t&)

operator delete[](void*)
operator delete[](void*, std::size_t)
operator delete[](void*, std::align_val_t)
operator delete[](void*, std::size_t, std::align_val_t)
operator delete[](void*, const std::nothrow_t&)
operator delete[](void*, std::align_val_t, const std::nothrow_t&)

Определения программы используются вместо версий по умолчанию, предоставляемых реализацией ([support.dynamic]). Такая замена происходит до запуска программы ([basic.def.odr],[basic.start]). Объявления программы не должны указываться как inline. Диагностика не требуется.

20.5.4.7 Handler functions [handler.functions]

Стандартная библиотека C ++ предоставляет версию по умолчанию для следующей функции-обработчика (пункт[language.support]):

  • terminate_­handler

Программа на C ++ может устанавливать различные функции-обработчики во время выполнения, предоставляя указатель на функцию, определенную в программе или библиотеке, в качестве аргумента для (соответственно):

См. Также подпункты[alloc.errors]Ошибки выделения памяти и[support.exception]Обработка исключений.

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

Вызовset_­* иget_­* функция не влечет за собой гонку данных. Вызов любой изset_­* функций должен синхронизироваться с последующими вызовами той же set_­* функции и соответствующейget_­* функции.

20.5.4.8 Other functions [res.on.functions]

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

В частности, эффекты не определены в следующих случаях:

  • forreplacement functions, если установленная функция замены не реализует семантику применимого Required behavior: абзаца.

  • для функций-обработчиков ([new.handler],[terminate.handler]), если установленная функция-обработчик не реализует семантику соответствующего Required behavior: абзаца

  • для типов , используемых в качестве аргументов шаблона при создании экземпляра шаблона компонента, если операции по типу не реализуют семантику применимых требований подпункта ([allocator.requirements],[container.requirements],[iterator.requirements], [algorithms.requirements],[numeric.requirements]). Операции с такими типами могут сообщать об ошибке, вызывая исключение, если не указано иное.

  • если какая-либо функция замены, функция обработчика или операция деструктора завершается через исключение, если иное не разрешено в соответствующем Required behavior: абзаце.

  • еслиincomplete type используется в качестве аргумента шаблона при создании экземпляра компонента шаблона, если это специально не разрешено для этого компонента.

20.5.4.9 Function arguments [res.on.arguments]

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

  • Если аргумент функции имеет недопустимое значение (например, значение вне домена функции или указатель, недопустимый для предполагаемого использования), поведение не определено.

  • Если аргумент функции описывается как массив, указатель, фактически переданный функции, должен иметь такое значение, чтобы все вычисления адресов и доступ к объектам (это было бы действительным, если бы указатель действительно указывал на первый элемент такого массива) на самом деле действительны.

  • Если аргумент функции привязывается к параметру ссылки rvalue, реализация может предположить, что этот параметр является уникальной ссылкой на этот аргумент. [ Note: Если параметр является универсальным параметром формыT&& иA привязано lvalue типа , аргумент привязывается к ссылке lvalue ([temp.deduct.call]) и, таким образом, не охвачен предыдущим предложением. ] [ Если программа преобразует lvalue в xvalue, передавая это lvalue библиотечной функции (например, вызывая функцию с аргументом ), программа фактически просит эту функцию рассматривать это lvalue как временное. Реализация позволяет оптимизировать проверки наложения псевдонимов, которые могут потребоваться, если аргумент был lvalue. ] end noteNote: std​::​move(x)end note

20.5.4.10 Library object access [res.on.objects]

Поведение программы не определено, если вызовы стандартных библиотечных функций из разных потоков могут вызвать гонку данных. Условия, при которых это может произойти, указаны в[res.on.data.races]. [ Note: Изменение объекта стандартного типа библиотеки, который совместно используется потоками, рискует неопределенным поведением, если только объекты этого типа явно не указаны как доступные для совместного использования без гонок данных или пользователь не предоставит механизм блокировки. ]end note

Если осуществляется доступ к объекту стандартного библиотечного типа, и начало объектаlifetime не происходит до доступа или доступ не происходит до конца времени существования объекта, поведение не определено, если не указано иное. [ Note: Это применимо даже к таким объектам, как мьютексы, предназначенным для синхронизации потоков. ]end note

20.5.4.11 Requires paragraph [res.on.required]

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