std::rethrow_exception(nullptr) поведение undefined или bad_exception?

У меня есть фрагмент кода, в котором я вызываю rethrow_exception с аргументом nullptr. В документации сказано, что аргумент должен быть ненулевым, но я хочу знать, если я передам nullptr, поведение не определено или известно?

Я получаю bad_exception каждый раз. Однако эта ссылка говорит, что поведение не определено.

std::string msg;
    try
    {
        std::rethrow_exception(nullptr);
    }
    catch (std::bad_exception &ex)
    {
        msg = ex.what();
    }
    catch (std::exception &ex)
    {
        msg = ex.what();
    }
    catch (...)
    {
        msg = "uncaught exception!";
    }

Кто-нибудь, кто может прокомментировать, что именно происходит?


person Ishita    schedule 11.12.2019    source источник
comment
Неопределенным поведением может быть что угодно. Вы не можете определить, что программа не имеет неопределенного поведения, проверив ее поведение.   -  person molbdnilo    schedule 11.12.2019
comment
molbdnilo, да.. Я понимаю это, я хотел знать, что говорит стандарт C++. @Max указал, что мне нужно.   -  person Ishita    schedule 11.12.2019
comment
@Ishita Если вы добавите тег language-lawyer, это сообщит людям, что вы хотите, чтобы ответы поддерживались цитаты из стандарта.   -  person Max Langhof    schedule 11.12.2019


Ответы (1)


Это неопределенное поведение.

Стандарт говорит:

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

Предварительные условия: p не является нулевым указателем.

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

Нарушение предварительного условия — это UB ([res.on.required]/2). Любое поведение, которое вы можете наблюдать, соответствует стандарту; стандарт C++ не накладывает никаких ограничений на то, что может произойти. Так что не делай этого.

person Max Langhof    schedule 11.12.2019
comment
Чтобы добавить: 20.5.4.11 Требуется абзац [res.on.required] 1 Нарушение предварительных условий, указанных в абзаце Requires: функции, приводит к неопределенному поведению, если только абзац Throws: функции не указывает создание исключения при нарушении предварительного условия. (в черновике, который у меня есть, это Requires вместо Preconditions, но то же самое) - person ChrisMM; 11.12.2019
comment
@ChrisMM Спасибо, добавлено. Так как это Preconditions, а не Requires, следующий абзац на самом деле единственный. - person Max Langhof; 11.12.2019
comment
Должен быть более новый черновик, чем тот, который я использую (N4659) — в нем нет Preconditions. - person ChrisMM; 11.12.2019