Пространства имён
Варианты
Действия

std::owner_less

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <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).

Содержание

[править]Специализации

Стандартная библиотека предоставляет специализацию std::owner_less, когда T не указан. В этом случае типы параметров выводятся из аргументов (каждый из которых по-прежнему должен быть либо std::shared_ptr, либо std::weak_ptr).

функциональный объект, обеспечивающий смешанное упорядочивание общих и слабых указателей на основе владельца, независимо от типа указателя
(специализация шаблона класса)[править]
(начиная с C++17)

Типы элементы

Тип элемент Определение
result_type(устарело в C++17) 2-3) bool
first_argument_type(устарело в C++17) 2) std::shared_ptr<T>
3) std::weak_ptr<T>
second_argument_type(устарело в C++17) 2) std::shared_ptr<T>
3) std::weak_ptr<T>
(до 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>)[править]
close