Как Visual Studio может использовать boost :: function с / GR-, а GCC не может с -fno-rtti? - PullRequest
1 голос
/ 21 августа 2011

Я недавно начал портировать приложение на Android с помощью NDK, и я столкнулся со следующей ошибкой:

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

Обычно, я бы не подумал дважды об этой ошибке, но набор файлов проекта Visual Studio /GR-, который отключает RTTI и не имеет проблем с использованием boost :: function.

Моя теория заключается в том, что, поскольку typeid вычисляется компилятором, когда можно определить статический тип, это должно иметь место для каждогоиспользование boost :: function в приложении.Visual Studio должна сначала попытаться определить статический тип, в то время как GCC немедленно выдает ошибку typeid, прежде чем пытаться ее оценить.

Это звучит правильно?Если нет, то что происходит?

1 Ответ

2 голосов
/ 21 августа 2011

Я не загрузился в свой раздел Windows, но это было так же просто посмотреть в MSDN.

Согласно эта ссылка на MSDN :

Если выражение разыменовывает указатель, и значение этого указателя равен нулю, typeid генерирует исключение bad_typeid. Если указатель не указывает на действительный объект, генерируется исключение __non_rtti_object, указывает на попытку проанализировать RTTI, который вызвал ошибку (например, нарушение доступа), потому что объект как-то недопустим (плохой указатель или код не был скомпилирован с /GR).

Если выражение не является ни указателем, ни ссылкой на базовый класс объекта, результатом является ссылка type_info, представляющая статический тип выражения. Статический тип выражения относится к типу выражения, известному во время компиляции .....

Другими словами, если тип выражения не может быть выведен во время компиляции и нет / GR, то вы получите исключение или ошибку компилятора. Но второй абзац подразумевает, что он может выводить не неоднозначные типы во время компиляции.

...