11

C ++ 0x(n3126)では、スマートポインターを、関係的にも同等性についても比較できます。しかし、これが行われる方法は私には一貫していないようです。

たとえば、shared_ptrdefineは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_ptrstd::lessなぜですか?そして、なぜ他の関係演算子も提供しないのですか?unique_ptroperator<shared_ptrunique_ptr

私はどちらの選択の背後にある理論的根拠を理解することができます:

  • メソッドに関して:これはポインターを表すため、組み込みのポインター演算子を使用するだけですが、連想コンテナー内で使用できる必要があるため、全順序付けを提供します(バニラポインターがデフォルトのstd::less述語テンプレート引数で取得されるように)
  • 完全性に関して:それはポインターを表すので、ポインターとすべて同じ比較を提供しますが、それはクラスタイプであり、連想コンテナーで使用されるのに匹敵するよりも少ない必要があるだけなので、その要件のみを提供します

しかし、スマートポインタの種類によって選択が変わる理由はわかりません。私は何が欠けていますか?


ボーナス/関連:std::shared_ptrから続いているようboost::shared_ptrで、後者は「設計上」他の関係演算子を省略してstd::shared_ptrいます(同様に)。どうしてこれなの?

4

1 に答える 1

12

これはC++11のドラフトの欠陥でした。std::unique_ptr関係演算子のオーバーロードを使用するように変更するために、欠陥レポートが開かれました。LWG欠陥1297std::lessを参照してください。

これは、最終的なC++11仕様に間に合うように修正されました。C++11§20.7.1.4[unique.ptr.special]/5は、operator<過負荷を指定します。

戻り値: less<CT>()(x.get(), y.get())

ここでx、およびyは演算子の2つのオペランドでありCT、2つのポインターの共通タイプです(異なるタイプへのポインター、たとえば異なるcv資格を持つポインターを比較できるため)。

于 2010-10-14T02:17:00.567 に答える