using exception_ptr = unspecified;
exception_ptr должны удовлетворять требованиям NullablePointer.
Два ненулевых значения типа 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_exception Note: bad_exception — end note
[[noreturn]] void rethrow_exception(exception_ptr p);
template<class E> exception_ptr make_exception_ptr(E e) noexcept;
Effects: Создает exception_ptr объект, который ссылается на копию e, как если бы:
try { throw e; } catch(...) { return current_exception(); }