Сравнение интеллектуальных указателей C ++ 0x: непоследовательное, в чем смысл? - PullRequest
11 голосов
/ 14 октября 2010

В 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();
}

Он также определил другие операторы отношения в аналогичнойfashion.


Почему смена метода и «полнота»?То есть, почему shared_ptr использует std::less, а unique_ptr использует встроенный operator<?И почему shared_ptr также не предоставляет другие реляционные операторы, такие как unique_ptr?

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

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

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


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

1 Ответ

12 голосов
/ 14 октября 2010

Это был дефект в черновиках C ++ 11; был открыт отчет о дефектах, чтобы изменить std::unique_ptr реляционные перегрузки операторов для использования std::less: см. Дефект LWG 1297 .

Это было исправлено вовремя для окончательной спецификации C ++ 11. C ++ 11 §20.7.1.4 [unique.ptr.special] / 5 указывает, что перегрузка operator<:

Возвращает: less<CT>()(x.get(), y.get())

, где x и y - два операнда оператора, а CT - общий тип двух указателей (поскольку можно сравнивать указатели на разные типы, например, с разными cv-квалификациями).

...