使用std::pair的C++常量正确性

C++ const correctness with std::pair

本文关键字:常量 正确性 C++ pair std 使用      更新时间:2023-10-16

我正在维护一个具有类似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有什么问题?在这种情况下,转换甚至是定义良好的,因为您在具有兼容(实际上是相同)表示的对象之间进行转换。