2013-05-06 22 views
8

tôi đã sử dụng typeid để có được các tên kiểu của std :: vector :: size_type và một số không nhỏ lớp A với đoạn mã sau (cppreference):đầu ra Strange của std :: typeid :: name()

#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; 

}; 

và tôi nhận này là đầu ra:

m 
1A 

tôi đoán rằng "1" trước khi "A" là kết quả của cơ sở rỗng Lớp Tối ưu hóa, nhưng những gì "m" đứng cho và là này bình thường không?

Tôi đang sử dụng phiên bản gcc sau: g ++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

+9

Các tên được trả về bởi 'type_info :: name' được thực hiện xác định. Gcc đã chọn 'm' cho' size_type'. Beats me :) – jrok

+0

@jrok ah, được rồi. :) – tmaric

+1

Bạn có thể muốn kiểm tra một tham chiếu trên hàm ['std :: type_info :: name'] (http://en.cppreference.com/w/cpp/types/type_info/name). –

Trả lời

11

G ++ sử dụng thực hiện xác định đặt tên cho các loại, nhưng nó cũng cung cấp các tiện ích c++filt để làm cho họ người có thể đọc được:

$ ./test | c++filt -t 
unsigned long 
A 
+0

Có! Tốt đẹp! Cảm ơn! :) – tmaric

+0

Vì vậy, tên "m" sau đó được dành riêng và cố định cho vector :: size_type (cho g ++)? – tmaric

+0

@ tomislav-maric tên "m" là viết tắt của 'unsigned long', điều này xảy ra là typedef cho' std :: size_t', điều này xảy ra là typedef cho 'std :: vector <> :: size_type'. Typedefs không tạo kiểu mới. – Cubbi