You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断C++中typeid(T)调用是编译期还是运行期确定的?

关于C++ typeid 编译期/运行期判定的编译器支持问题

C++关键字typeid具备特殊行为:它会根据操作数的类型特性,自动选择使用编译期类型信息或运行期类型信息。示例代码如下:

#include <iostream>
#include <typeinfo>
using namespace std;
struct Interface      { virtual void f() = 0;               };
struct S1 : Interface {         void f() { cout << "S1\n"; }};
struct S3 : S1        {         void f() { cout << "S3\n"; }};
int main() {
    S1 s1;
    cout << typeid(s1).name() << endl;
    S1* ps = new S3;
    cout << typeid(ps).name() << endl;
    cout << typeid(*ps).name() << endl;
    delete ps;
    return 0;
}

该程序输出:

struct S1
struct S1 * __ptr64
struct S3

问题

GCC/Clang编译器是否提供编译器宏或type_traits,来揭示typeid的这一特性,告知我们typeid(*ps)是编译期确定还是运行期确定的?

回答

GCC和Clang并没有提供专门的宏或type_trait来直接判定某一typeid表达式是编译期还是运行期解析,但可以结合C++标准规则和现有工具推导:

  1. 依据C++标准规则判断

    • 当typeid的操作数是**多态类型的泛左值(glvalue)**时,typeid会在运行期解析,获取对象的实际动态类型。比如示例中的typeid(*ps),*ps是多态类型S1的泛左值,实际指向S3对象,因此属于运行期解析。
    • 其他场景(操作数为非多态类型、指针本身、字面量等),typeid均在编译期解析,直接获取静态类型信息。比如typeid(s1)(静态类型与动态类型一致的多态对象)、typeid(ps)(指针类型),都属于编译期解析范畴。
  2. 借助标准库或编译器内置工具辅助判断

    • 标准库的std::is_polymorphic trait,或GCC/Clang内置的__is_polymorphic,可以在编译期判断某类型是否为多态类型(即包含虚函数)。结合操作数是否为该类型的泛左值,就能推导typeid的解析时机。

内容的提问来源于stack exchange,提问作者gongliming7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:12:41