Xeo*_*Xeo 6 c++ reflection exception
考虑这个例子:
struct Nobody_Expects_The_Spanish_Inquisition{};
int main(){
throw Nobody_Expects_The_Spanish_Inquisition();
}
Run Code Online (Sandbox Code Playgroud)
Ideone上显示的输出:
抛出的一个实例后终止叫Nobody_Expects_The_Spanish_Inquisition "
Windows的类似输出:
Test.exe中0x760fb727处的未处理异常:Microsoft C++异常:内存位置0x001ffea3处的Nobody_Expects_The_Spanish_Inquisition
可以看出,最终的程序集似乎已经包含了异常的名称,或者有另一种获取名称的方法.
这可以被视为某种反思吗?或者,如果实际可以显示异常的名称,它是否依赖于编译器/ OS?
小智 7
它依赖于编译器.显然,编译器很容易发现每个throw,并将每个抛出的对象的类型编码到可执行文件中.但是没有要求他们应该这样做.
考虑到这一点,异常必须在抛出时复制到一个奇怪的依赖于实现的空间.因此,通过此机制可以访问特定编译器的运行时,可以访问其类型的名称.