owner_less_void — std::owner_less<void>
owner_less_void — std::owner_less
std::owner_less<void>는 매개변수 타입이 추론되는 std::owner_less의 특수화예요. C++17에서 도입됐어요.
operator()가 std::shared_ptr/std::weak_ptr을 소유권 기반(owner-based) 의미론으로 비교해요.
출처: cppreference
본문
// <memory> 헤더, C++17
template<>
struct owner_less<void>;
중첩 타입
| 중첩 타입 | 정의 |
|---|---|
is_transparent |
불명시(unspecified) — 투명 함수 객체 |
멤버 함수
| 함수 | 설명 |
|---|---|
operator() |
인자를 소유권 기반 의미론으로 비교 |
#include <memory>
#include <set>
std::shared_ptr<int> a = std::make_shared<int>(1);
std::shared_ptr<int> b = std::make_shared<int>(1);
// 일반 비교: a == b 는 가리키는 값이 같아도 ptr이 달라 false
// owner 비교: 소유권(제어 블록) 기준
// owner_less는 정렬에 사용
std::set<std::shared_ptr<int>, std::owner_less<>> s;
s.insert(a);
s.insert(b); // a와 b가 같은 제어 블록이면 중복으로 간주 안 함
소유권 기반 비교란?
std::owner_less는 operator<를 포인터 값이 아니라 공유 소유권(제어 블록) 기준으로 수행해요.
std::shared_ptr<int> p1 = std::make_shared<int>(5);
std::shared_ptr<int> p2(p1); // p1과 같은 제어 블록 공유
std::owner_less<> less;
// p1과 p2가 같은 소유 블록이면, 둘 다 서로보다 작지 않음
bool r = less(p1, p2); // false (같은 소유권)
이는 std::set<std::shared_ptr<T>> 같은 컨테이너를 만들 때 유용한데, 구체적인 포인터 주소가 아니라 "같은 객체를 소유하는지"를 기준으로 그룹핑·정렬할 수 있어요.
owner_less<void>는 is_transparent를 제공해 서로 다른 스마트 포인터 타입(shared_ptr, weak_ptr)도 혼합해 비교할 수 있게 해줘요.