代码之家  ›  专栏  ›  技术社区  ›  rmeador

可以按转换运算符的类型捕获异常吗?

  •  7
  • rmeador  · 技术社区  · 15 年前

    我不知道如何用简短的主题来表达这个问题,所以让我试着用更长的解释。假设我有这些异常类:

    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?
    }
    

    我猜不会,这很不幸,但我想我会问的,因为我在网上找不到任何关于它的信息。是的,我意识到我可以在我的编译器中运行程序,看看会发生什么,但这并不能告诉我标准对这种行为的描述,也不能告诉我编译器实现了什么(我不信任它)。

    1 回复  |  直到 15 年前
        1
  •  15
  •   Johannes Schaub - litb    15 年前

    你不能。标准 15.3/3 :

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

    • 处理程序的类型为 cv T cv T& e和t是同一类型(忽略顶级cv- 限定符),或
    • 处理程序的类型为 循环伏安 履历表; t是e的一个明确的公共基类,或者
    • 处理程序的类型为 cv1 T* cv2 e是指针类型,可以转换为处理程序的类型 由其中一个或两个
      • 一种标准指针转换(4.10),不涉及到指针到私有指针或受保护指针的转换,或 不明确的类
      • 资格转换

    你想要的场景与这些都不匹配。 cv 表示“常量和/或易失性组合”