std::rethrow_exception(nullptr) 未定义行为还是 bad_exception?

Ish*_*ita 2 c++ exception nullptr language-lawyer rethrow

我有一个代码片段,我用 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!";
    }
Run Code Online (Sandbox Code Playgroud)

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

Max*_*hof 5

这是未定义的行为。

标准

[[noreturn]] void rethrow_exception(exception_ptr p);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 要添加: _20.5.4.11 Requires 段落 [res.on.required] 1 违反函数的 Requires: 段落中指定的前提条件会导致未定义的行为,除非函数的 Throws: 段落指定在违反前提条件时抛出异常。_ (在我的草案中,它是_Requires_而不是_Preconditions_,但是是一样的) (2认同)