Я пытаюсь использовать shared_ptr
во встроенном проекте, который собран с xc32 1.34 (производная от gcc 4.5.2). В проекте отключен RTTI с -fno-rtti
,
#include <memory>
Просто включение заголовка дает мне следующие ошибки:
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del<_Ty, _Dx>::_Get_deleter(const std::type_info&) const':
In file included from APP/MODULES/LIGHT_MANAGER/LightManager.cpp:13:0:
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1264:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In member function 'virtual void* std::tr1::_Ref_count_del_alloc<_Ty, _Dx, _Alloc>::_Get_deleter(const std::type_info&) const':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1299:39: error: cannot use typeid with -fno-rtti
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory: In function '_Dx* std::tr1::get_deleter(const std::tr1::shared_ptr<_Ty2>&)':
/Applications/microchip/xc32/v1.34/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/include/Cpp/memory:1956:44: error: cannot use typeid with -fno-rtti
Итак, что я хочу знать: это вообще невозможно использовать shared_ptr
без RTTI или я что-то не так делаю?
Проблема заключается в get_deleter
свободная функция:
template<class D, class T> D* get_deleter(const shared_ptr<T>& p) noexcept;
Возвращает: Если
p
владеет удалителемd
типа резюме-неквалифицированныйD
, возвращаетstd:addressof(d)
; в противном случае возвращаетсяnullptr
, Возвращенный указатель остается действительным, пока существуетshared_ptr
экземпляр, который владеетd
,
Очевидно, что самая простая реализация этого заключается в хранении typeid
удалителя в блоке управления. Хотя существуют и другие возможные реализации, они будут (а) более сложными, (б) потерять двоичную совместимость с кодом, поддерживающим RTTI, и (в) будут противоречить «духу» -fno-rtti
,
Еще одна проблемная функция dynamic_pointer_cast
, который вызывает dynamic_cast
на сохраненном указателе.
Тем не менее, основной функционал shared_ptr
реализуемо без использования функций RTTI, и, как действительно упоминал Сергей Никулов, shared_ptr
поставляется с GCC 4.8.5 работает с -fno-rtti
за исключением get_deleter
а также dynamic_pointer_cast
функции; до тех пор, пока вы не используете эти средства, нет никаких причин, по которым вы не сможете их использовать shared_ptr
, Это можно сравнить с, например, any
, который не может быть реализован без использования typeid
,
Ваш поставщик обязан предоставить стандартную библиотеку, которая работает во всех конфигурациях своего компилятора, включая нестандартные, если они поддерживают их использование. Однако, если ваш поставщик не сотрудничает, у вас все еще есть несколько вариантов:
get_deleter
код;Других решений пока нет …