【问题标题】:Strange output of std::typeid::name()std::typeid::name() 的奇怪输出
【发布时间】:2013-05-06 10:01:51
【问题描述】:

我使用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

我猜“A”之前的“1”是空基类优化的结果,但是“m”代表什么,这正常吗?

我正在使用以下 gcc 版本:g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3

【问题讨论】:

  • type_info::name 返回的名称是实现定义的。 Gcc 为 size_type 选择了 m。打败我:)
  • @jrok 啊,那好吧。 :)
  • 您可能需要检查std::type_info::name 函数的引用。
  • @JoachimPileborg 我做到了,但我想我期待更好的东西,而不仅仅是一个“m”字符。 :)
  • “A”前面的“1”是因为这是名称A的长度。

标签: c++ typeinfo


【解决方案1】:

G++ 使用实现定义的类型命名,但它也提供实用程序c++filt 以使它们易于阅读:

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

【讨论】:

  • 那么,名称“m”然后为vector::size_type(对于g++)保留和固定?
  • @tomislav-maric 名称“m”代表unsigned long,恰好是std::size_t 的typedef,恰好是std::vector&lt;&gt;::size_type 的typedef。 Typedef 不会创建新类型。
  • 我知道他们不会创建新类型,我的意思是:“m”是“m”,然后对于 G++ 是“unsigned_long”的名称,它在某处定义(编译器实现?),所以 c+ +filt 在那里查找,并将其映射回“unsigned_long”?
  • @tomislav-maric 是的,/usr/bin/g++/usr/bin/c++filt 是同一个编译器实现的一部分。
【解决方案2】:

我在 gcc 上用于检查类型的快速 hack 是一个带有转发引用参数的模板函数,打印 __PRETTY_FUNCTION__:

template<typename T>
void PrintType(T&&) {
    cout << __PRETTY_FUNCTION__ << endl;
}

这可能会打印如下内容:

void PrintType(T&&) [with T = long unsigned int]

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2017-09-15
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多