std::rethrow_exception(nullptr) 未定义行为或 bad_exception?
std::rethrow_exception(nullptr) undefined behavior or bad_exception?
我有一个代码片段,其中我使用 nullptr 作为参数调用 rethrow_exception。
文档说参数应该是非空的,但我想知道,如果我传递 nullptr,行为是未定义的还是已知的?
我每次都收到 bad_exception。然而,这个 link 表示行为未定义。
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!";
}
谁能对到底发生了什么发表评论?
这是未定义的行为。
标准says:
[[noreturn]] void rethrow_exception(exception_ptr p);
Preconditions: p
is not a null pointer.
Throws: The exception object to which p
refers.
违反前提条件是 UB ([res.on.required]/2
)。您可能观察到的任何行为都是符合标准的; C++ 标准对可能发生的事情没有任何限制。所以不要这样做。
我有一个代码片段,其中我使用 nullptr 作为参数调用 rethrow_exception。 文档说参数应该是非空的,但我想知道,如果我传递 nullptr,行为是未定义的还是已知的?
我每次都收到 bad_exception。然而,这个 link 表示行为未定义。
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!";
}
谁能对到底发生了什么发表评论?
这是未定义的行为。
标准says:
[[noreturn]] void rethrow_exception(exception_ptr p);
Preconditions:
p
is not a null pointer.Throws: The exception object to which
p
refers.
违反前提条件是 UB ([res.on.required]/2
)。您可能观察到的任何行为都是符合标准的; C++ 标准对可能发生的事情没有任何限制。所以不要这样做。