Visual Studio 如何将 boost::function 与 /GR- 一起使用,而 GCC 不能使用 -fno-rtti?

How can Visual Studio use boost::function with /GR- while GCC can't with -fno-rtti?

本文关键字:GCC -fno-rtti 不能 一起 Studio boost Visual function GR-      更新时间:2023-10-16

我最近开始使用NDK将一个应用程序移植到Android上,我遇到了以下错误:

boost/function/function_base.hpp:220: error: cannot use typeid with -fno-rtti.

通常情况下,我不会考虑这个错误,但是visual studio项目文件设置/GR-,它禁用RTTI并且使用boost::函数没有问题。

我的理论是,因为typeid是在静态类型可以确定时由编译器计算的,所以在应用程序中每次使用boost::函数都必须是这种情况。Visual Studio必须首先尝试确定静态类型,而GCC在尝试计算typeid之前立即抛出错误。

听起来对吗?如果不是,发生了什么?

我没有启动到我的Windows分区,但是在MSDN中查找这个很简单。

根据MSDN上的此链接:

如果表达式解引用一个指针,以及该指针的值为0时,typeid抛出一个bad_typeid异常。如果指针没有指向一个有效的对象,抛出__non_rtti_object异常,表示试图分析触发故障的RTTI(如访问冲突),因为对象在某种程度上是无效的(坏指针)或者代码没有用/GR编译).

如果表达式既不是指针也不是基类的引用对象的返回结果是一个type_info引用表达式的静态类型。表达式的静态类型引用转换为编译时已知的表达式类型.....

换句话说,如果表达式的类型不能在编译时推断出来,并且没有/GR,那么你将得到一个异常或编译器错误。但是第二段暗示它可以在编译时推断出非二义性类型。