Spec-Zone.ru › C++

std::owner_less

Определено в заголовке <memory>
template< class T >
struct owner_less; /* undefined */
(1) (начиная с C++11)
(до C++17)
template< class T = void >
struct owner_less; /* undefined */
(начиная с 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(), различаются (например, потому что они указывают на разные подобъекты одного объекта).

1) Смешанное упорядочение разных типов на основе владения не предоставляется для типов, отличных от std::shared_ptr и std::weak_ptr.
2) Смешанное упорядочение std::shared_ptr на основе владения.
Это предпочтительный предикат сравнения при создании ассоциативных контейнеров с std::shared_ptr в качестве ключей, то есть std::map<std::shared_ptr<T>,U,std::owner_less<std::shared_ptr<T>>>.
3) Смешанное упорядочение std::weak_ptr на основе владения.
Это предпочтительный предикат сравнения при создании ассоциативных контейнеров с std::weak_ptr в качестве ключей, то есть std::map<std::weak_ptr<T>,U,std::owner_less<std::weak_ptr<T>>>.
4) Специализация для void выводит типы параметров из аргументов.

Оператор operator< по умолчанию не определён для слабых указателей и может ошибочно считать два указателя на один и тот же объект неэквивалентными (см. std::shared_ptr::owner_before).

Специализации

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

owner_less<void>
функциональный объект, предоставляющий смешанное упорядочение общих и слабых указателей разных типов на основе владения, независимо от типа объекта, на который указывает указатель
(специализация шаблона класса)
(начиная с 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()

только для специализации std::shared_ptr
bool operator()( const std::shared_ptr<T>& lhs, 
                 const std::shared_ptr<T>& rhs ) const noexcept;
(1) (начиная с C++11)
(constexpr начиная с C++26)
только для специализации std::weak_ptr
bool operator()( const std::weak_ptr<T>& lhs, 
                 const std::weak_ptr<T>& rhs ) const noexcept;
(2) (начиная с C++11)
(constexpr начиная с C++26)
для обеих специализаций — std::shared_ptr и std::weak_ptr
bool operator()( const std::shared_ptr<T>& lhs, 
                 const std::weak_ptr<T>& rhs ) const noexcept;
(3) (начиная с C++11)
(constexpr начиная с C++26)
bool operator()( const std::weak_ptr<T>& lhs, 
                 const std::shared_ptr<T>& rhs ) const noexcept;
(4) (начиная с C++11)
(constexpr начиная с C++26)

Сравнивает lhs и rhs, используя семантику владения. Фактически вызывает lhs.owner_before(rhs).

Упорядочение является отношением строгого слабого порядка.

lhs и rhs эквивалентны, только если оба они пусты или разделяют владение.

Параметры

lhs, rhs - указатели совместного владения для сравнения

Возвращаемое значение

true, если lhs меньше rhs согласно упорядочению на основе владения, и false в противном случае.

Примечания

Макрос проверки возможностей Значение Стандарт Возможность
__cpp_lib_constexpr_memory 202506L (C++26) constexpr std::owner_less

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Корректное поведение
LWG 2873 C++11 operator() не требовалось быть noexcept должен быть noexcept

См. также

owner_before
предоставляет упорядочение общих указателей на основе владения
(открытая функция-член std::shared_ptr<T>)
owner_before
предоставляет упорядочение слабых указателей на основе владения
(открытая функция-член std::weak_ptr<T>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/owner_less

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API