Namespaces
Variants

std::weak_ptr<T>:: owner_before

From cppreference.net

Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
template < class Y >
bool owner_before ( const weak_ptr < Y > & other ) const noexcept ;
template < class Y >
bool owner_before ( const std:: shared_ptr < Y > & other ) const noexcept ;

Проверяет, предшествует ли этот weak_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++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2083 C++11 owner_before не был объявлен const объявлен const
LWG 2942 C++11 owner_before не был объявлен noexcept объявлен noexcept

Смотрите также

(C++11)
предоставляет смешанное владельческое упорядочение shared и weak указателей
(шаблон класса)