C++ 您能通过转换运算符的类型捕获异常吗?
我不知道如何在简短的主题行中很好地表达这个问题,所以让我尝试一个较长的解释。假设我有以下异常类:C++ 您能通过转换运算符的类型捕获异常吗?,c++,exception-handling,conversion-operator,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 Excep
class ExceptionTypeA : public std::runtime_error
{
// stuff
};
class ExceptionTypeB : public std::runtime_error
{
// stuff
operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};
然后我可以这样做,让它触发捕捉块吗
try
{
throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
// will this be triggered?
}
我猜不会,这很不幸,但我想我会问的,因为我在网上找不到任何关于它的信息。是的,我意识到我可以在我的编译器中运行程序,看看会发生什么,但这并不能告诉我标准对这种行为的描述,只是我的编译器实现了什么(我不相信它)。你不能。标准格式见
15.3/3
:
处理程序与类型为E的异常对象匹配,如果
- 处理程序的类型为
或cv T
且E和T是同一类型(忽略顶级cv)- 限定符),或cv T&
- 处理程序的类型为
或cvt
,并且T是明确的公共基类E,或cvt&
- 处理程序的类型为
,E是指针类型,可以转换为处理程序的类型 一方或双方cv1t*cv2
- 一种标准指针转换(4.10),不涉及到私有或受保护或非私有指针的转换 模糊类
- 资格转换
您想要的场景与这些都不匹配
cv
表示“常量和/或易失性组合”是否包含指向成员的指针?例如,指向成员数据的指针是反变的,因此int(Base::*)
可以转换为int(Derived::*)
。如果我扔掉前者,我能抓住后者吗?gcc似乎不同意,但标准措辞有点不清楚。