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 上找不到任何信息。是的,我意识到我可以在我的编译器中运行程序并看看会发生什么,但这并不能告诉我标准对这种行为的描述,只是我的编译器实现了什么(我不相信它)。

4

1 回答 1

15

你不能。标准15.3/3

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

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

您想要的场景与这些都不匹配。cv表示“const 和/或 volatile 组合”

于 2010-02-26T16:56:52.463 回答