21 Language support library [language.support]

21.8 Exception handling [support.exception]

21.8.6 Exception propagation [propagation]

using exception_ptr = unspecified;

Тип exception_­ptr может использоваться для ссылки на объект исключения.

exception_­ptr должны удовлетворять требованиям NullablePointer.

Два ненулевых значения типа exception_­ptr эквивалентны и сравниваются как равные тогда и только тогда, когда они относятся к одному и тому же исключению.

Конструктор по умолчанию exception_­ptr создает нулевое значение типа.

exception_­ptr не должен быть неявно преобразован в какой-либо арифметический, перечисляемый или указательный тип.

[ Note: Реализация может использовать интеллектуальный указатель с подсчетом ссылок как exception_­ptr. ] end note

В целях определения наличия гонки данных операции с exception_­ptr объектами должны обращаться и изменять только exception_­ptr сами объекты, а не исключения, на которые они ссылаются. Использование rethrow_­exception на exception_­ptr объектах, которые ссылаются на один и тот же объект исключения, не должно приводить к гонке за данные. [ Note: Если rethrow_­exception повторно генерируется тот же объект исключения (а не копия), одновременный доступ к этому повторно генерированному объекту исключения может привести к гонке данных. Изменения количества exception_­ptr объектов, которые ссылаются на конкретное исключение, не приводят к гонке за данные. ] end note

exception_ptr current_exception() noexcept;

Returns: exception_­ptr Объект , который ссылается на currently handled exception или копию текущего перекачиваемого исключения, или нулевой exception_­ptr объект , если исключение не обрабатывается. Указанный объект должен оставаться действительным, по крайней мере, пока существует exception_­ptr объект, который на него ссылается. Если функции необходимо выделить память и попытка не удалась, она возвращает exception_­ptr объект, который ссылается на экземпляр bad_­alloc. Не указано, относятся ли возвращаемые значения двух последовательных вызовов к current_­exception одному и тому же объекту исключения. [ Note: То есть не указано, current_­exception создается ли новая копия каждый раз при ее вызове. ] Если попытка скопировать текущий объект исключения вызывает исключение, функция возвращает объект, который ссылается на сгенерированное исключение или, если это невозможно, на экземпляр . [ Конструктор копирования вызванного исключения также может дать сбой, поэтому реализации разрешено заменять объект, чтобы избежать бесконечной рекурсии. ] end note exception_­ptr bad_­exceptionNote: bad_­exception end note

[[noreturn]] void rethrow_exception(exception_ptr p);

Requires: p не должен быть нулевым указателем.

Throws: Объект исключения, на который p ссылается.

template<class E> exception_ptr make_exception_ptr(E e) noexcept;

Effects: Создает exception_­ptr объект, который ссылается на копию e, как если бы:

try {
  throw e;
} catch(...) {
  return current_exception();
}

[ Note: Эта функция предназначена для удобства и эффективности. ] end note