如何判断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++标准规则和现有工具推导:
依据C++标准规则判断
- 当
typeid的操作数是**多态类型的泛左值(glvalue)**时,typeid会在运行期解析,获取对象的实际动态类型。比如示例中的typeid(*ps),*ps是多态类型S1的泛左值,实际指向S3对象,因此属于运行期解析。 - 其他场景(操作数为非多态类型、指针本身、字面量等),
typeid均在编译期解析,直接获取静态类型信息。比如typeid(s1)(静态类型与动态类型一致的多态对象)、typeid(ps)(指针类型),都属于编译期解析范畴。
- 当
借助标准库或编译器内置工具辅助判断
- 标准库的
std::is_polymorphictrait,或GCC/Clang内置的__is_polymorphic,可以在编译期判断某类型是否为多态类型(即包含虚函数)。结合操作数是否为该类型的泛左值,就能推导typeid的解析时机。
- 标准库的
内容的提问来源于stack exchange,提问作者gongliming7
相关产品推荐
相关产品推荐

