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) | ||||||||||
Функции-элементы
| сравнивает свои аргументы, используя семантику на основе владельца (функция) |
std::owner_less::operator()
<tbody> </tbody>| только элемент специализации шаблона owner_less<shared_ptr<T>> |
||
bool operator()( const std::shared_ptr<T>& lhs, const std::shared_ptr<T>& rhs ) const noexcept; |
(начиная с C++11) | |
| только элемент специализации шаблона owner_less<weak_ptr<T>> |
||
bool operator()( const std::weak_ptr<T>& lhs, const std::weak_ptr<T>& rhs ) const noexcept; |
(начиная с C++11) | |
| элемент обеих специализаций шаблона |
||
bool operator()( const std::shared_ptr<T>& lhs, const std::weak_ptr<T>& rhs ) const noexcept; |
(начиная с C++11) | |
bool operator()( const std::weak_ptr<T>& lhs, const std::shared_ptr<T>& rhs ) const noexcept; |
(начиная с 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>)
|