std::weak_ptr<T>::owner_before
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' // 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 | Применимо к | Поведение, опубликованное в | Корректное поведение |
|---|---|---|---|
| LWG 2083 | C++11 |
owner_before не был объявлен const | объявлен const |
| LWG 2942 | C++11 |
owner_before не был объявлен noexcept | объявлен noexcept |
См. также
|
(C++11) | предоставляет упорядочение владельца смешанного типа для общих и слабых указателей (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/weak_ptr/owner_before