std::owner_less
Определено в заголовочном файле <memory> | ||
(1) | ||
template<class T > struct owner_less;/* неопределено */ | (начиная с C++11) (до C++17) | |
template<class T =void> struct owner_less;/* неопределено */ | (начиная с C++17) | |
template<class T > struct owner_less<std::shared_ptr<T>>; | (2) | (начиная с C++11) |
template<class T > struct owner_less<std::weak_ptr<T>>; | (3) | (начиная с C++11) |
template<> struct owner_less<void>; | (4) | (начиная с C++17) |
Этот функциональный объект предоставляет упорядочивание смешанного типа, основанное на владении объектом (в противоположность упорядочиванию по значению) для std::weak_ptr и std::shared_ptr. Порядок расположения будет определён следующим образом: два умных указателя считаются равными, если они оба пусты или оба управляют одним и тем же объектом, даже в том случае, если значения указателей, полученных с помощью функции-элемента get()
различаются (например потому, что они оба указывают на разные подъобъекты внутри одного и того же объекта).
Этот шаблонный класс является предпочтительным предикатом сравнения при построении ассоциативных контейнеров с использованием std::shared_ptr или std::weak_ptr в качестве ключей, к примеру
std::map<std::shared_ptr<T>, U, std::owner_less<std::shared_ptr<T>>>
или
std::map<std::weak_ptr<T>, U, std::owner_less<std::weak_ptr<T>>>.
operator< по умолчанию не определён для слабых указателей и может ошибочно посчитать два разделяемых указателя на один и тот же объект неравными (смотрите shared_ptr::owner_before).
Содержание |
[править]Специализации
Стандартная библиотека предоставляет специализацию
| (начиная с C++17) |
Типы элементы
| (до C++20) |
[править]Функции-элементы
operator() | сравнивает свои аргументы, используя семантику на основе владельца (функция) |
std::owner_less::operator()
только элемент специализации шаблона owner_less<shared_ptr<T>> | ||
bool operator()(conststd::shared_ptr<T>& lhs, conststd::shared_ptr<T>& rhs )constnoexcept; | (начиная с C++11) | |
только элемент специализации шаблона owner_less<weak_ptr<T>> | ||
bool operator()(conststd::weak_ptr<T>& lhs, conststd::weak_ptr<T>& rhs )constnoexcept; | (начиная с C++11) | |
элемент обеих специализаций шаблона | ||
bool operator()(conststd::shared_ptr<T>& lhs, conststd::weak_ptr<T>& rhs )constnoexcept; | (начиная с C++11) | |
bool operator()(conststd::weak_ptr<T>& lhs, conststd::shared_ptr<T>& rhs )constnoexcept; | (начиная с C++11) | |
Сравнивает lhs и rhs, используя семантику на основе владельца. Эффективно вызывает lhs.owner_before(rhs).
Порядок является строгим слабым отношением порядка.
lhs и rhs эквивалентны, только если они оба пусты или имеют общее владение.
Параметры
lhs, rhs | — | указатели общего владения для сравнения |
Возвращаемое значение
true, если lhsменьше чемrhs, как определено порядком на основе владельцев.
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 2873 | C++11 | operator()'ы не могут быть объявлены как noexcept | объявлены noexcept |
[править]Смотрите также
обеспечивает упорядочивание общих указателей на основе владельца (public функция-элемент std::shared_ptr ) | |
обеспечивает упорядочивание слабых указателей на основе владельцев (public функция-элемент std::weak_ptr<T> ) |