你能通过转换运算符的类型捕获异常吗?

rme*_*dor 8 c++ exception-handling conversion-operator

我不知道如何在一个简短的主题行中很好地表达这个问题,所以让我尝试一个更长的解释.假设我有这些异常类:

class ExceptionTypeA : public std::runtime_error
{
    // stuff
};

class ExceptionTypeB : public std::runtime_error
{
    // stuff

    operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};
Run Code Online (Sandbox Code Playgroud)

我可以这样做,并让它触发catch块吗?

try
{
    throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
    // will this be triggered?
}
Run Code Online (Sandbox Code Playgroud)

我猜它不会,这是不幸的,但我想我会问,因为我无法在网上或SO上找到任何信息.是的,我意识到我可以在我的编译器中运行程序,看看会发生什么,但这不会告诉我标准对这种行为的说法,只是我的编译器实现的(我不相信它).

Joh*_*itb 15

你不能.Standardese at 15.3/3:

处理程序是E类型的异常对象的匹配项

  • 处理程序是类型cv T或者cv T&E和T是相同类型(忽略顶级cv限定符),或
  • 处理程序是类型cv T或者cv T&T是E的明确公共基类,或者
  • 处理程序是类型cv1 T* cv2,E是指针类型,可以通过其中一个或两个转换为处理程序的类型
    • 标准指针转换(4.10),不涉及到指向私有或受保护或模糊类的指针的转换
    • 资格转换

您希望的方案与这些方案都不匹配.cv表示"常量和/或挥发性组合"