我不知道如何在一个简短的主题行中很好地表达这个问题,所以让我尝试更长的解释。假设我有这些异常类:
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上找到任何信息。是的,我意识到我可以在我的编译器中运行程序,看看会发生什么,但这不会告诉我标准对这种行为的说法,只是我的编译器实现的(我不相信它)。 / p>
答案 0 :(得分:15)
你做不到。标准为15.3/3
:
处理程序是E类型的异常对象的匹配,如果
- 处理程序的类型为
cv T
或cv T&
,而E和T的类型相同(忽略顶级cv- 限定词),或- 处理程序的类型为
cv T
或cv T&
,T是E的明确公共基类,或- 处理程序的类型为
cv1 T* cv2
,E是指针类型,可以转换为处理程序的类型 通过其中一个或两个
- 标准指针转换(4.10),不涉及到私有或受保护或指针的转换 模糊的课程
- 资格转换
您想要的方案与这些都不匹配。 cv
表示“const和/或volatile组合”