Странный вывод std::typeid::name()

Я использовал typeid для получения имен типов std::vector::size_type и класса A нулевого размера со следующим кодом (cppreference):

#include<iostream>
#include <vector>
#include <typeinfo>

using namespace std;

class A {};

int main()
{
    vector<int> v(10); 

    vector<int>::size_type s = v.size(); 

    A a; 

    cout << typeid(s).name() << endl;
    cout << typeid(a).name() << endl;

};

И я получил это как вывод:

m
1A

Я предполагаю, что «1» перед «A» является результатом оптимизации пустого базового класса, но что означает «m» и нормально ли это?

Я использую следующую версию gcc: g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3


person tmaric    schedule 06.05.2013    source источник
comment
Имена, возвращаемые type_info::name, определяются реализацией. Gcc выбрал m вместо size_type. Бьет меня :)   -  person jrok    schedule 06.05.2013
comment
@jrok а, тогда ладно. :)   -  person tmaric    schedule 06.05.2013
comment
Вы можете проверить ссылку на функцию std::type_info::name.   -  person Some programmer dude    schedule 06.05.2013
comment
@JoachimPileborg Да, но, думаю, я ожидал чего-то лучшего, чем просто m-персонаж. :)   -  person tmaric    schedule 06.05.2013
comment
1 перед A потому, что это длина имени A.   -  person Mike Seymour    schedule 06.05.2013
comment
Возможный дубликат удобный для чтения type_info.name()   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 23.07.2016


Ответы (1)


G++ использует для типов имена, определяемые реализацией, но также предлагает утилиту c++filt, чтобы сделать их удобочитаемыми:

$ ./test | c++filt -t
unsigned long
A
person Cubbi    schedule 06.05.2013
comment
Итак, имя m затем зарезервировано и зафиксировано для vector‹int›::size_type (для g++)? - person tmaric; 06.05.2013
comment
@ tomislav-maric имя m означает unsigned long, которое оказывается typedef для std::size_t, которое оказывается typedef для std::vector<>::size_type. Определения типов не создают новые типы. - person Cubbi; 06.05.2013
comment
Я знаю, что они не создают новые типы, я имел в виду следующее: является ли m тогда для G++ именем для unsigned_long, и оно где-то определено (реализация компилятора?), поэтому c++filt ищет его там и отображает обратно в беззнаковый_длинный? - person tmaric; 06.05.2013
comment
@ tomislav-maric Да, /usr/bin/g++ и /usr/bin/c++filt являются частью одной и той же реализации компилятора. - person Cubbi; 06.05.2013