gpt4 book ai didi

c++ - type_info 不是 RTTI 的一部分吗?

转载 作者:可可西里 更新时间:2023-11-01 18:35:31 25 4
gpt4 key购买 nike

我问了一个问题 Do C++ POD types have RTTI?有人在评论中告诉我:

POD types do have type_info, but don't have RTTI, and that's possible because type_info isn't always RTTI.

这似乎是正确的,因为我可以获得 POD(非多态)类型的 type_info

但是当我编译这个简单的程序时:

#include <iostream>

struct X
{
int a;
};

int main()
{
using namespace std;

std::cout << typeid(X) << std::endl;

return 0;
}

带有 GCC 的标志 -fno-rtti:

$ g++ -fno-rtti main.cpp && ./main

它不会编译:

main.cpp: In function ‘int main()’:
main.cpp:12:26: error: cannot use typeid with -fno-rtti
std::cout << typeid(X) << std::endl;
^

这是否意味着 type_info 是 RTTI 的一部分,或者它只是 GCC 的一个行为

最佳答案

摘要

RTTI 本身并不是真正正式定义的东西:C++ 只说明了 typeiddynamic_cast 做了什么,而不是它们是如何实现的。然而,将此类操作归为一个通用名称 RTTI 确实很方便。

请注意,不需要实现在运行时严格获取此信息,即

if ( typeid(int) == typeid(double) )

也可以在程序评估期间确定,很像 std::is_sameint 无疑是非多态的(它没有“动态”类型)。 cppreference甚至声称:

When applied to an expression of polymorphic type, evaluation of a typeid expression may involve runtime overhead (a virtual table lookup), otherwise typeid expression is resolved at compile time.

但要谨慎对待。


Does that mean type_info is a part of RTTI, or is it just a behavior of GCC?

type_info 是一个。您不能构造任何该类型的对象 - 您只能通过 typeid 构造。

-fno-rtti在 GCC 下禁用 RTTI:您不能使用 typeid,因此也不能是 type_info。他们彼此非常亲密。

总而言之,原引述是完全正确的:

POD types do have type_info, but don't have RTTI, and that's possible because type_info isn't always RTTI.

运行时信息可通过 typeid 获得。没有任何动态需要考虑(事实上,dynamic_cast 没有任何意义)。

关于c++ - type_info 不是 RTTI 的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37699188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com