std::shared_ptr::owner_before
template< class Y > bool owner_before( const shared_ptr<Y>& other ) const noexcept; |
||
template< class Y > bool owner_before( const std::weak_ptr<Y>& other ) const noexcept; |
||
Проверяет, предшествует ли этот shared_ptr объекту other в порядке, определяемом реализацией на основе владельца (в отличие от порядка, основанного на значении). Порядок таков, что два умных указателя при сравнении эквивалентны, только если они оба пусты или если они оба владеют одним и тем же объектом, даже если значения указателей, полученных с помощью get(), различны (например, если они указывают на разные подобъекты внутри одного объекта).
Такой порядок используется для того, чтобы общие и слабые указатели можно было использовать в качестве ключей в ассоциативных контейнерах, обычно через std::owner_less.
Параметры
| other | — | std::shared_ptr или std::weak_ptr для сравнения |
Возвращаемое значение
true, если *this предшествует other, иначе false. Типичные реализации сравнивают адреса блоков управления.
Пример
#include <iostream>
#include <memory>
struct Foo {
int n1;
int n2;
Foo(int a, int b) : n1(a), n2(b) {}
};
int main()
{
auto p1 = std::make_shared<Foo>(1, 2);
std::shared_ptr<int> p2(p1, &p1->n1);
std::shared_ptr<int> p3(p1, &p1->n2);
std::cout << std::boolalpha
<< "p2 < p3 " << (p2 < p3) << '\n'
<< "p3 < p2 " << (p3 < p2) << '\n'
<< "p2.owner_before(p3) " << p2.owner_before(p3) << '\n'
<< "p3.owner_before(p2) " << p3.owner_before(p2) << '\n';
std::weak_ptr<int> w2(p2);
std::weak_ptr<int> w3(p3);
std::cout
// << "w2 < w3 " << (w2 < w3) << '\n' // не будет компилироваться
// << "w3 < w2 " << (w3 < w2) << '\n' // не будет компилироваться
<< "w2.owner_before(w3) " << w2.owner_before(w3) << '\n'
<< "w3.owner_before(w2) " << w3.owner_before(w2) << '\n';
}
Вывод:
p2 < p3 true
p3 < p2 false
p2.owner_before(p3) false
p3.owner_before(p2) false
w2.owner_before(w3) false
w3.owner_before(w2) false
Отчеты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2873 | C++11 | owner_before не был объявлен как noexcept
|
объявлен noexcept
|
Смотрите также
(C++11) |
обеспечивает смешанный тип разделяемых и слабых указателей на основе владельцев (шаблон класса) |