std::weak_ptr<T>:: owner_before
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
weak_ptr::owner_before
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
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 указателей
(шаблон класса) |