Namespaces
Variants

std::shared_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 shared_ptr < Y > & other ) const noexcept ;
template < class Y >
bool owner_before ( const std:: weak_ptr < Y > & other ) const noexcept ;
**Примечание:** Весь код C++ внутри тегов ` ` сохранен без изменений, как и требовалось. HTML-теги и атрибуты также остались нетронутыми.

Проверяет, предшествует ли данный 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' // won't compile 
//            << "w3 < w2 " << (w3 < w2) << '\n' // won't compile
              << "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 Applied to Behavior as published Correct behavior
LWG 2873 C++11 owner_before was not declared noexcept declared noexcept

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

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