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(), различаются (например, потому что они указывают на разные подобъекты одного объекта).
std::shared_ptr и std::weak_ptr.std::shared_ptr на основе владения.std::shared_ptr в качестве ключей, то есть std::map<std::shared_ptr<T>,U,std::owner_less<std::shared_ptr<T>>>.std::weak_ptr на основе владения.std::weak_ptr в качестве ключей, то есть std::map<std::weak_ptr<T>,U,std::owner_less<std::weak_ptr<T>>>.Оператор operator< по умолчанию не определён для слабых указателей и может ошибочно считать два указателя на один и тот же объект неэквивалентными (см. std::shared_ptr::owner_before).
СпециализацииСтандартная библиотека предоставляет специализацию
| (начиная с C++17) |
Вложенные типы
| (до C++20) |
Функции-члены
| сравнивает аргументы, используя семантику владения (функция) |
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 |
См. также
| предоставляет упорядочение общих указателей на основе владения (открытая функция-член std::shared_ptr<T>) |
|
| предоставляет упорядочение слабых указателей на основе владения (открытая функция-член 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