使用std::pair的C++常量正确性
C++ const correctness with std::pair
我正在维护一个具有类似std::map
/std::unordered_map
接口的容器类。
接口声称存储std::pair<const X,Y>
(即value_type
就是这样)。然而,在内部,该实现存储了一个std::pair<X,Y>
的排序数组。
当前的实现使用reinterpret_cast
来实现迭代器。我的问题是,还有更好的选择吗?
转移到存储std::pair<const X,Y>
的数组是不可能的,因为实现需要复制数组中的元素来实现插入和删除。其中一种方法是使用std::sort
。
编辑:尽管我认为reinterpret_cast
调用了未定义的行为(或定义的实现?),但我还没有遇到一个编译器不起作用——我什么都不担心吗?
迭代器解引用的当前实现:
template <class K, class M>
std::pair<const K,M>& operator*() {
std::pair<K,M>& result = ...;
return *reinterpret_cast<std::pair<const K,M>*)(&result);
}
我相信您不能通过返回std::pair
来解决这个问题。相反,您将不得不返回一个看起来像标准对的代理对象,但如果您更新second
成员,它会传播到主容器,而第一个成员则根据您的意愿公开为const
。
"更好的替代方案?"reinterpret_cast
有什么问题?在这种情况下,转换甚至是定义良好的,因为您在具有兼容(实际上是相同)表示的对象之间进行转换。
相关文章:
- 代理对象的常量正确性
- std::函数常量正确性未遵循
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- 自定义引用包装器的常量正确性
- 如果我公开常量和非常量 API,我是否破坏了常量正确性?
- 如何强制实施有关指针数据成员的常量正确性
- 如何在C++的多维地图中实现常量正确性
- C++ 函数参数或声明中的常量正确性
- 结构初始化中的常量正确性
- 常量正确性编译错误到模板函数中的无效转换错误
- 如何在不违反常量正确性的情况下使用 std::lock_guard
- 非平凡变量的常量正确性
- 常量正确性和成员参考
- 常量正确性和shared_ptr,一个设计问题
- 观察者常量正确性
- 如何跨指针保持常量正确性
- 为了速度牺牲常量正确性可以吗
- file read()常量正确性
- C++NULL指针和常量正确性
- 共享指针和常量正确性