我正在尝试使用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;
Returns: If p
拥有删除器d
类型的cv-不合格D
,返回std:addressof(d)
;否则返回nullptr
。只要存在,返回的指针就保持有效shared_ptr
拥有的实例d
.
显然,最直接的实现就是存储typeid
控制块中的删除器。虽然还有其他可能的实现,但它们会 (a) 更加复杂,(b) 失去与启用 RTTI 的代码的二进制兼容性,并且 (c) 违背-fno-rtti
.
另一个有问题的函数是dynamic_pointer_cast
,这称为dynamic_cast
在存储的指针上。
然而,主要功能shared_ptr
无需使用 RTTI 功能即可实现,事实上,正如 Sergei Nikulov 上面提到的,shared_ptr
随 gcc 4.8.5 一起提供-fno-rtti
,除了get_deleter
and dynamic_pointer_cast
功能;只要您不使用这些设施,就没有理由不能使用shared_ptr
。这可以与例如形成对比any
,如果不使用则无法实现typeid
.
您的供应商有责任提供一个可在其编译器的所有配置中工作的标准库,包括非标准配置(如果他们支持其使用)。但是,如果您的供应商不合作,您仍然有一些选择:
- 修补提供的标准库以删除损坏的
get_deleter
code;
- 使用替代标准库(例如更新的 libstdc++ 或 libc++);
- 使用替代的智能指针工具(例如 Boost)或自己编写一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)