我刚刚看到一个包含 dynamic_cast from std::exception
to的代码std::nested_exception
,例如,
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
这对于and来说是不是很特别std::nested_exception
?或者,我可以在对象dynamic_cast<A&>(b)
类型A
和类型b
没有共同基类的情况下成功吗?