最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

function
<memory_resource>

# std::pmr::operator==(C++17)

    namespace std::pmr {

      template <class Tp = byte>
      class polymorphic_allocator {

      public:

        friend bool operator==(const polymorphic_allocator& a,
                               const polymorphic_allocator& b) noexcept;  // (1)

      };

      template <class T1, class T2>
      bool operator==(const polymorphic_allocator<T1>& a,
                      const polymorphic_allocator<T2>& b) noexcept;       // (2)
    }

## 概要

2つの`polymorphic_allocator`オブジェクトを等値比較する。

## 戻り値

`*a.resource() == *b.resource()`

## 備考

C++20以降、これらの演算子により以下の演算子が使用可能になる（制約は使用する`==`に準ずる）。

    friend bool operator!=(const polymorphic_allocator& a,
                           const polymorphic_allocator& b) noexcept;  // (3)

    template <class T1, class T2>
    bool operator!=(const polymorphic_allocator<T1>& a,
                    const polymorphic_allocator<T2>& b) noexcept;

(1)と(3)の演算子はHidden friendsとして定義される。

## 例

    #include <iostream>
    #include <memory_resource>

    int main()
    {
      std::cout << std::boolalpha;
      auto mr = std::pmr::monotonic_buffer_resource{};
      std::pmr::polymorphic_allocator<int> alloc{ &mr };

      // (1) : memory_resourceとの比較
      std::cout << (alloc == &mr) << std::endl;
      std::cout << (alloc == std::pmr::get_default_resource()) << std::endl;

      std::cout << '\n';
      std::pmr::polymorphic_allocator<int> alloc2{};
      std::pmr::polymorphic_allocator<double> alloc3{ &mr };

      // (2) : polymorphic_allocator同士の比較
      std::cout << (alloc == alloc2) << std::endl;
      std::cout << (alloc == alloc) << std::endl;
      // 同じmemory_resourceを利用していればtrue
      std::cout << (alloc == alloc3) << std::endl;
    }

### 出力

    true
    false

    false
    true
    true

## バージョン

### 言語

- C++17

### 処理系

- Clang: ??
- GCC: 9.1 ✅
- Visual C++: 2017 update 6 ✅

## 関連項目

- `operator==`

## 参照

- LWG Issue 3683. `operator==` for `polymorphic_allocator` cannot deduce template argument in common cases