我不确定其他版本,但是,在VS 2008中,即使禁用了RTTI,我也可以通过在类型上调用typeid(T).name()
来查询信息。它适用于所有类型,内部和用户创建。
我们的项目已禁用RTTI,但我惊讶地发现这仍然有效。这是一个Visual Studio错误还是/GR-
标志不足以禁用它?这是否属于undefined behavior
的范围?如果它不是一个bug,我该怎么把它关掉?
答案 0 :(得分:6)
是否有可能在编译时已知类型的表达式上使用typeid
?如果是这样,你将完全绕过RTTI的“运行时”方面。来自typeid
上的Microsoft文档:
如果表达式既不是指针也不是对基类的引用 对象的结果是一个表示的对象的type_info引用 表达式的静态类型。表达式的静态类型是指 到编译时已知的表达式类型。执行 在评估一个静态类型时会忽略语义 表达
答案 1 :(得分:2)
首先,在禁用RTTI时使用typeid
(或dynamic_cast
)肯定会导致未定义的行为。我的建议是不要这样做。
在任何情况下,我都不相信你需要做除/GR-
以外的任何事情来禁用微软编译器中的RTTI。这可能是一个错误,它在这样做时不会发出警告或错误。它会对dynamic_cast
:
1>d:\src\MyClass.cpp (82) : warning C4541: 'dynamic_cast' used on polymorphic type 'MyClass' with /GR-; unpredictable behavior may result
但是,typeid
没有给出任何警告。这在VS2010编译器中也没有改变。
附注:如果您尝试将typeid
与-fno-rtti
一起使用,则gcc会出现编译错误,而clang则不会(尽管使用-Wall
)。