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

发布于 2024-08-23 02:20:32 字数 567 浏览 7 评论 0原文

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

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

I don't know how to phrase the question very well in a short subject line, so let me try a longer explanation. Suppose I have these exception classes:

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

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

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

Can I then do this, and have it trigger the catch block?

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

I'm going to guess that it will not, which is unfortunate, but I thought I'd ask, since I couldn't find any info on it on the net or on SO. And yes, I realize I could just run the program in my compiler and see what happens, but that wouldn't tell me what the standard says about this behavior, just what my compiler implements (and I don't trust it).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

写下不归期 2024-08-30 02:20:32

你不能。标准语 15.3/3

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

  • 处理程序的类型为 cv Tcv T&,并且 E 和 T 为相同类型(忽略顶级 cv-
    限定符),或者
  • 处理程序的类型为 cv Tcv T&,并且 T 是 E 的明确公共基类,或者
  • 处理程序的类型为cv1 T* cv2,E 是可以转换为处理程序类型的指针类型
    由其中之一或两者

    • 标准指针转换(4.10),不涉及到私有或受保护或
      不明确的类
    • 资格转换

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

You cannot. Standardese at 15.3/3:

A handler is a match for an exception object of type E if

  • The handler is of type cv T or cv T& and E and T are the same type (ignoring the top-level cv-
    qualifiers), or
  • the handler is of type cv T or cv T& and T is an unambiguous public base class of E, or
  • the handler is of type cv1 T* cv2 and E is a pointer type that can be converted to the type of the handler
    by either or both of

    • a standard pointer conversion (4.10) not involving conversions to pointers to private or protected or
      ambiguous classes
    • a qualification conversion

Your desired scenario matches none of these. cv means "const and/or volatile combination"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文