最終更新日時: 2026年02月25日 13時06分35秒 (JST)
Akira Takahashi が更新

履歴 編集

class
<memory>

# std::owner_hash(C++26)

    namespace std {
      struct owner_hash;
    }

## 概要

`owner_hash`は、スマートポインタを所有権ベースでハッシュするための関数オブジェクトである。

スマートポインタを、`unordered_set`や`unordered_map`のキーにする際、値ベースではなく所有権ベースにハッシュすることを指定するために使用する。

`owner_equal`と組み合わせて使用する。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator()` | 関数呼び出し演算子 | C++26

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`is_transparent` | `operator()` が関数テンプレートである事を示すタグ型。 実装依存の型であるがあくまでタグ型であり、型そのものには意味はない。 | C++26

## 例

    #include <print>
    #include <memory>
    #include <unordered_set>

    template <class Key>
    using shared_ptr_uset = std::unordered_set<
      std::shared_ptr<Key>,
      std::owner_hash,
      std::owner_equal
    >;

    struct X {
      int i;
      int j;
    };

    int main()
    {
      shared_ptr_uset<int> us;

      std::shared_ptr<int> p1(new int(2));

      std::shared_ptr<X> px(new X());
      // 同じ所有権(px)を持つが、異なるポインタを指すp2とp3
      std::shared_ptr<int> p2(px, &(px->i));
      std::shared_ptr<int> p3(px, &(px->j));

      us.insert(p1);
      us.insert(p2);
      us.insert(p3); // owner_hashでは、p2とp3が同じリソースを
                     // 指していると見なされるので、p3は挿入されない

      std::println("{}", s.size());
    }

### 出力

    2

## バージョン

### 言語

- C++26

### 処理系

- Clang: 22 ✅
- GCC: 16 ✅
- Visual C++: 2026 Update 2 ❌

## 関連項目

- `std::owner_equal`
- `std::owner_less`
- `std::shared_ptr::owner_hash()`
- `std::weak_ptr::owner_hash()`

## 参照

- P1901R2 Enabling the Use of `weak_ptr` as Keys in Unordered Associative Containers