c++ - std::rethrow_exception(nullptr) 未定义行为或 bad_exception?

标签 c++ exception language-lawyer nullptr rethrow

我有一个代码片段,我用 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++ 标准对可能发生的情况没有任何限制。所以不要这样做。

关于c++ - std::rethrow_exception(nullptr) 未定义行为或 bad_exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59285088/

相关文章:

C# 动态函数 AmbigiousMatchException?

c# - 异常堆栈跟踪不显示抛出异常的位置

c++ - 在文件末尾预处理多行注释及其嵌入的换行符

c++ - 复制省略在默认函数参数中有效吗?

c++ - 不同引用限定符重载运算符结果的类型特征

C++ if语句使用lambda表达式返回true但输出来自false,为什么

c++ - 使用引用不会导致有关未定义行为的警告

c++ - 如何向 CPrintDialogEx 添加属性页

c++ - 浮点运算

java - Java中如何处理异常而不必回到try block 的开头?