名前空間
変種
操作

std::owner_less

From cppreference.com
< cpp‎ | memory
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
ヘッダ <memory> で定義
(1)
template< class T >
struct owner_less; /* 未定義 */
(C++11以降)
(C++17まで)
template< class T = void >
struct owner_less; /* 未定義 */
(C++17以降)
template< class T >
struct owner_less<std::shared_ptr<T>>;
(2) (C++11以降)
template< class T >
struct owner_less<std::weak_ptr<T>>;
(3) (C++11以降)
template<>
struct owner_less<void>;
(4) (C++17以降)

この関数オブジェクトは、std::weak_ptrstd::shared_ptrの両方に対して、所有者ベースの(値ベースとは対照的な)混合型順序を提供します。この順序付けは、2つのスマートポインタが両方とも空であるか、または所有権を共有している場合にのみ等価であるとみなされます。これは、get()によって取得される生のポインタの値が異なる場合でも(例えば、同じオブジェクト内の異なるサブオブジェクトを指している場合でも)同様です。

1) 所有者ベースの混合型順序付けは、std::shared_ptrおよびstd::weak_ptr以外の型には提供されません。
2) std::shared_ptrの所有者ベースの混合型順序付け。
これは、std::shared_ptrをキーとして連想コンテナを構築する際の推奨される比較述語です。つまり、std::map<std::shared_ptr<T>, U, std::owner_less<std::shared_ptr<T>>>
3) std::weak_ptrの所有者ベースの混合型順序付け。
これは、std::weak_ptrをキーとして連想コンテナを構築する際の推奨される比較述語です。つまり、std::map<std::weak_ptr<T>, U, std::owner_less<std::weak_ptr<T>>>
4) void特殊化は、引数からパラメータ型を推論します。

デフォルトのoperator<はweak pointerには定義されておらず、同じオブジェクトに対する2つのshared pointerを誤って非等価と見なす可能性があります(std::shared_ptr::owner_beforeを参照)。

目次

特殊化

標準ライブラリは、`T`が指定されていない場合に`std::owner_less`の特殊化を提供します。この場合、パラメータの型は引数から推論されます(それぞれの引数は引き続きstd::shared_ptrまたはstd::weak_ptrのいずれかでなければなりません)。

被指針型に関わらず、sharedおよびweak pointerの混合型所有者ベースの順序付けを提供する関数オブジェクト
(クラステンプレート特殊化) [編集]
(C++17以降)


ネストされた型

ネストされた型 定義
result_type (C++17で非推奨) (2,3) bool
first_argument_type (C++17で非推奨) (2) std::shared_ptr<T>
(3) std::weak_ptr<T>
second_argument_type (C++17で非推奨) (2) std::shared_ptr<T>
(3) std::weak_ptr<T>
(C++20まで)

[編集] メンバ関数

operator()
引数を所有者ベースのセマンティクスで比較する
(関数)

std::owner_less::operator()

特殊化 (2) のみのメンバ
bool operator()( const std::shared_ptr<T>& lhs,
                 const std::shared_ptr<T>& rhs ) const noexcept;
(C++11以降)
特殊化 (3) のみのメンバ
bool operator()( const std::weak_ptr<T>& lhs,
                 const std::weak_ptr<T>& rhs ) const noexcept;
(C++11以降)
両方のテンプレート特殊化のメンバ
bool operator()( const std::shared_ptr<T>& lhs,
                 const std::weak_ptr<T>& rhs ) const noexcept;
(C++11以降)
bool operator()( const std::weak_ptr<T>& lhs,
                 const std::shared_ptr<T>& rhs ) const noexcept;
(C++11以降)

lhsrhs を所有者ベースのセマンティクスで比較します。実質的に lhs.owner_before(rhs) を呼び出します。

この順序は厳密弱順序関係です。

lhsrhs は、両方が空であるか、または所有権を共有している場合にのみ等価です。

パラメータ

lhs, rhs - 比較する共有所有権ポインタ

戻り値

lhs が所有者ベースの順序付けによって rhs より小さいと判断された場合は true、それ以外の場合は false

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2873 C++11 operator()はnoexceptである必要はなかった noexceptであることが要求される

[編集] 関連項目

共有ポインタの所有者ベースの順序を提供します
(std::shared_ptr<T> のパブリックメンバ関数) [編集]
weak pointer の所有者ベースの順序付けを提供します
(std::weak_ptr<T> のパブリックメンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)