Пространства имён
Варианты
Действия

std::shared_ptr::owner_before

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
 
<tbody> </tbody>
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

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

обеспечивает смешанный тип разделяемых и слабых указателей на основе владельцев
(шаблон класса) [править]