В 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
делает тоже самое).Почему это?