Skip to content

败犬日报 2025-09-04

1. std::unordered_map<int*, int> 不能传常量指针

cpp
void foo(std::unordered_map<int*, int> &m, const int* key) {
    m.find(key);  // 报错
    m.find(const_cast<int*>(key));
}

如果不能改 unordered_map 的类型,就只能每次都 const_cast 了。

如果能改,最简单的做法是 std::unordered_map<const int*, int>

也可以加透明查找,但是问题是:

  1. 需要 C++20。
  2. 得自己写一个资瓷 transparent hash 的工具类。
  3. 有一个理论的问题,标准没有保证 std::hash<int*>{}(ptr) == std::hash<const int*>{}(ptr) 始终为 true,实际上应该能跑。

代码如下:

cpp
struct MyTransparentHash {
    using is_transparent = void;

    template<typename T>
    auto operator()(const T& x) const {
        return std::hash<T>{}(x);
    }
};

void foo(std::unordered_map<int*, int, MyTransparentHash, std::equal_to<>>& map,
         const int* key) {
    map.find(key);
}