2

我有一个代码片段,我用 nullptr 作为参数调用 rethrow_exception。文档说参数应该是非空的,但我想知道,如果我通过 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!";
    }

任何人,谁能评论到底发生了什么?

4

1 回答 1

5

这是未定义的行为。

标准

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

前提条件: p不是空指针。

抛出:p引用的异常对象。

违反先决条件是 UB ( [res.on.required]/2)。您可能观察到的任何行为都符合标准;C++ 标准对可能发生的事情没有任何限制。所以不要这样做。

于 2019-12-11T11:55:54.253 回答