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

std::rethrow_exception(nullptr) undefined behavior or bad_exception?

本文关键字:exception bad rethrow nullptr std 未定义      更新时间:2023-10-16

我有一个代码片段,我用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!";
}

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

这是未定义的行为。

该标准说:

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

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

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

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