Zed*_*Zed 5 c++ pointers stl const map
我有一个带有std ::指针映射的类作为成员.现在,我想以只读方式公开该成员:既不允许修改地图,也不允许修改指向的对象.在内部我需要那些非const的指针,我想将它们公开为const.
我确实有一个至少可以编译的解决方案,但我想知道我是否会遇到任何隐藏的问题.
class A
{
public:
const std::map<int, const float*>& GetMap() const { return *(reinterpret_cast< const std::map<int, const float*>* >( &m_Map)); }
private:
std::map<int, float*> m_Map;
};
Run Code Online (Sandbox Code Playgroud)
我可以想到一个可能的问题:如果std :: map的内部布局对于指针映射和const指针映射是不同的,那么这将导致丑陋的错误.但我想不出任何理智的原因.有人有什么想法吗?
澄清:我知道这是一个黑客,并且有更安全的解决方案(如单独的访问器功能).我只是想知道这是否会因为我遗漏的一些信息而立即破裂.
这当然是未定义的(编辑:它看起来实际上只是未指定的)行为,因为这两个地图(从语言的角度来看)完全不相关的类型.它似乎现在可以工作,但有时它会破裂并导致大量的麻烦.
您是否考虑过而不是暴露实现细节(您在内部使用地图)而不是为您的类的公共接口提供const_iterator
s和find
方法?
编辑:见5.2.10/7:
指向对象的指针可以显式转换为指向不同类型对象的指针.65)除了将"指向T1的指针"的rvalue转换为"指向T2的指针"类型(其中T1和T2是对象类型,T2的对齐要求不比T1更严格)并返回其原始值type产生原始指针值,这种指针转换的结果是未指定的.
从该引用我们得出结论,从具有非const值类型的映射到具有const值类型的映射具有未指定的行为.此外,实际取消引用转换后的指针可能会违反严格的别名规则并导致未定义的行为.
归档时间: |
|
查看次数: |
2110 次 |
最近记录: |