为什么name()函数返回的字符串是实现定义的?

Des*_*tor 3 c++ rtti typeid

考虑以下示例:

#include <iostream>
#include <typeinfo>
int main()
{
    int a=9;
    std::cout << typeid(a).name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.8.1上的输出:i

MSVS 2010上的输出:int

为什么输出是编译器依赖?这背后的原因是什么?为什么它被保留为实现定义?为什么在所有编译器上没有相同的输出?C++标准是否明确地说明了这一点?

Jon*_*ely 6

因为编译器以不同的方式表示类型,并且不使用相同的内部.

的G ++字符串是错位的类型名称,返回该(而不是demangling它)是更少的工作和更有效.要求编译器对这些字符串进行解码会增加更多工作量.标准由实施者决定是否要这样做.

如果标准规定它,那么它还必须指定各种事物,例如是否说signed long或只是long以及如何表示依赖于其他类型和常量的复杂模板实例化.标准化这些字符串的好处是非常小,但是大量的工作.