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