【发布时间】:2018-04-25 08:53:41
【问题描述】:
例如,我刚刚看到一个包含从std::exception 到std::nested_exception 的dynamic_cast 的代码,
try {
std::throw_with_nested(std::runtime_error("error"));
} catch (std::exception &e) {
auto &nested = dynamic_cast<std::nested_exception&>(e);
std::cout << "ok" << std::endl;
}
一开始,我认为这段代码不会被编译,因为std::nested_exception 不是从std::exception 派生,我希望dynamic_cast 会对继承进行静态检查,但我错了。
虽然我找不到明确提到 dynamic_cast 允许这样做的相关标准规范,但我确认所有三个主要编译器 (clang/gcc/msvc) 都允许在完全不相关的类型之间使用 dynamic_cast。
但是,std::nested_exception 仍然不是从std::exception 派生的,所以我认为dynamic_cast 会抛出bad_alloc 异常并且"ok" 永远不会打印。我又错了。
现在,我想知道这是如何工作的。这对于std::exception 和std::nested_exception 来说是不是很特别?或者,我可以创建另一个成功的dynamic_cast<A&>(b) 类型A 和对象类型b 没有公共基类吗?
【问题讨论】:
标签: c++ c++11 exception dynamic-cast nested-exceptions