命名空间
变体
操作

std::type_info::name

来自 cppreference.com
< cpp‎ | types‎ | type info
 
 
实用程序库
语言支持
类型支持 (基本类型, RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
 
const char* name() const;
(自 C++11 起 noexcept)

返回一个实现定义的以空字符结尾的字符字符串,其中包含类型的名称。不提供任何保证;特别是,返回的字符串对于几种类型可能是相同的,并且在同一程序的多次调用之间可能会发生变化。

内容

[编辑] 参数

(无)

[编辑] 返回值

以空字符结尾的字符字符串,其中包含类型的名称。

[编辑] 注释

返回的指针指向的数组的生存期未指定,但实际上它只要给定类型的 RTTI 数据结构存在,它就一直持续存在,除非从可以卸载的动态库中加载,该数据结构具有应用程序生存期。

一些实现(例如 MSVC、IBM、Oracle)会生成人类可读的类型名称。其他实现,最著名的是 gcc 和 clang,会返回经过修饰的名称,该名称由 Itanium C++ ABI 指定。经过修饰的名称可以使用特定于实现的 API 转换为人类可读的形式,例如 abi::__cxa_demangle 直接或通过 boost::core::demangle。它还可以通过命令行实用程序 c++filt -t 传递。

[编辑] 示例

#include <boost/core/demangle.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
#include <typeinfo>
 
struct Base { virtual ~Base() = default; };
struct Derived : Base {};
 
int main()
{
    Base b1;
    Derived d1;
 
    const Base* pb = &b1;
    std::cout << typeid(*pb).name() << '\n';
    pb = &d1;
    std::cout << typeid(*pb).name() << '\n';
 
    std::string real_name = boost::core::demangle(typeid(pb).name());
    std::cout << typeid(pb).name() << " => " << real_name << '\n';
 
    std::cout << "c++filt => " << std::flush;
    std::string s = typeid(pb).name();
    std::system(("c++filt -t " + s).data());
}

可能的输出

// GCC/Clang:
4Base
7Derived
PK4Base => Base const*
c++filt => Base const*
 
// MSVC:
struct Base
struct Derived
struct Base const * __ptr64 => struct Base const * __ptr64

[编辑] 另请参阅

(C++11)
返回对于相同类型相同的数值
(公有成员函数) [编辑]