C ++ 0x(n3126)では、スマートポインターを、関係的にも同等性についても比較できます。しかし、これが行われる方法は私には一貫していないようです。
たとえば、shared_ptr
defineはoperator<
次と同等です。
template <typename T, typename U>
bool operator<(const shared_ptr<T>& a, const shared_ptr<T>& b)
{
return std::less<void*>()(a.get(), b.get());
}
を使用std::less
すると、指定されていないバニラリレーショナルポインタ比較とは異なり、ポインタ値に関する全順序付けが提供されます。
ただし、unique_ptr
次と同じ演算子を定義します。
template <typename T1, typename D1, typename T2, typename D2>
bool operator<(const unique_ptr<T1, D1>& a, const unique_ptr<T2, D2>& b)
{
return a.get() < b.get();
}
また、同様の方法で他の関係演算子を定義しました。
なぜ方法と「完全性」の変更?つまり、ビルトインを使用しながら使用するのshared_ptr
はstd::less
なぜですか?そして、なぜ他の関係演算子も提供しないのですか?unique_ptr
operator<
shared_ptr
unique_ptr
私はどちらの選択の背後にある理論的根拠を理解することができます:
- メソッドに関して:これはポインターを表すため、組み込みのポインター演算子を使用するだけですが、連想コンテナー内で使用できる必要があるため、全順序付けを提供します(バニラポインターがデフォルトの
std::less
述語テンプレート引数で取得されるように) - 完全性に関して:それはポインターを表すので、ポインターとすべて同じ比較を提供しますが、それはクラスタイプであり、連想コンテナーで使用されるのに匹敵するよりも少ない必要があるだけなので、その要件のみを提供します
しかし、スマートポインタの種類によって選択が変わる理由はわかりません。私は何が欠けていますか?
ボーナス/関連:std::shared_ptr
から続いているようboost::shared_ptr
で、後者は「設計上」他の関係演算子を省略してstd::shared_ptr
います(同様に)。どうしてこれなの?