class
<memory>
std::owner_equal(C++26)
namespace std {
struct owner_equal;
}
概要
owner_equalは、スマートポインタを所有権ベースで等値比較するための関数オブジェクトである。
スマートポインタを、unordered_setやunordered_mapのキーにする際、値ベースではなく所有権ベースに比較することを指定するために使用する。
owner_hashと組み合わせて使用する。
メンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
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_equalでは、p2とp3が同じリソースを
// 指していると見なされるので、p3は挿入されない
std::println("{}", us.size());
}
出力
2
バージョン
言語
- C++26
処理系
- Clang: 22 ✅
- GCC: 16 ✅
- Visual C++: 2026 Update 2 ❌