Сравнение умных указателей C ++ 0x: несогласованные, в чем смысл ?

В C ++ 0x (n3126) интеллектуальные указатели можно сравнивать как реляционно, так и на предмет равенства. Однако способ, которым это делается, мне кажется несовместимым.

Например, shared_ptr определяет 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 использует встроенный оператор <? И почему shared_ptr также не предоставляет другие операторы отношения, такие как unique_ptr ?

Я могу понять обоснование любого выбора:

  • в отношении метода: он представляет указатель, поэтому просто используйте встроенные операторы указателя, вместо того, чтобы его можно было использовать в ассоциативном контейнере, чтобы обеспечить полное упорядочение (как обычный указатель со значением по умолчанию std :: less аргумент шаблона предиката)
  • в отношении полноты: он представляет собой указатель, поэтому обеспечивает все те же сравнения, что и указатель, по сравнению с типом класса и только должен быть менее сопоставимым для использования в ассоциативный контейнер, поэтому укажите только это требование

Но я не понимаю, почему выбор изменяется в зависимости от типа интеллектуального указателя. Что мне не хватает?


Бонус / связанный: std :: shared_ptr , похоже, следует из boost :: shared_ptr , а последний опускает другие реляционные операторы «намеренно» (и std :: shared_ptr тоже). Почему это?

11
задан James McNellis 29 September 2012 в 03:33
поделиться