C++是否已经有某种反思?

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,并将每个抛出的对象的类型编码到可执行文件中.但是没有要求他们应该这样做.

考虑到这一点,异常必须在抛出时复制到一个奇怪的依赖于实现的空间.因此,通过此机制可以访问特定编译器的运行时,可以访问其类型的名称.

  • @Omni:-1因为有更好的答案?没有道理的.如果答案提出了不良做法或者说是错误的,那么应该给出-1,而不是因为人们认为答案不是最好的.来吧... (2认同)