Spec-Zone.ru › C++

std::weak_ptr<T>::owner_before

template< class Y > 
bool owner_before( const weak_ptr<Y>& other ) const noexcept;
(1) (constexpr с C++26)
template< class Y >
bool owner_before( const std::shared_ptr<Y>& other ) const noexcept;
(2) (constexpr с C++26)

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

Отчёт об ошибке Применено к Опубликованное поведение Правильное поведение
LWG 2083 C++11 owner_before не был объявлен const объявлен как const
LWG 2942 C++11 owner_before не был объявлен noexcept объявлен как noexcept

См. также

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

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

Spec-Zone.ru

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