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

10

我不知道怎么用简短的主题来表达我的问题,所以让我试着解释一下。假设我有以下异常类:

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

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

    operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};

那么我可以这样做,并触发catch块吗?

try
{
    throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
    // will this be triggered?
}

我猜它不会,这很遗憾,但由于在网上或SO上找不到相关信息,所以我想问一下。是的,我知道我可以在编译器中运行程序并查看发生了什么,但那并不能告诉我标准对这种行为的规定,只能告诉我我的编译器实现了什么(而且我不信任它)。

1个回答

16
无法如此做。在《C++标准》的第15.3/3条款中规定:
如果处理程序的类型是cv Tcv T&,并且E和T是相同的类型(忽略顶层CV限定符),则处理程序与类型为E的异常对象相匹配;或者
如果处理程序的类型是cv Tcv T&,并且T是E的一个清晰公共基类,则处理程序与类型为E的异常对象相匹配;或者
如果处理程序的类型是cv1 T* cv2,并且E是指针类型,可以通过以下一种或多种方式将E转换为处理程序的类型:
标准指针转换(4.10),不涉及到私有或保护或不明确的类的指针转换;
资格转换。
您所需的情况不符合上述任何一种情况。cv表示“const和/或volatile组合”。

这是否包括成员指针?例如,成员数据指针是逆变的,因此 int (Base::*) 可以转换为 int (Derived::*)。如果我抛出前者,能否捕获后者?GCC似乎不同意,但标准措辞有点不清楚。 - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接