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_lessoperator<포인터 값이 아니라 공유 소유권(제어 블록) 기준으로 수행해요.

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)도 혼합해 비교할 수 있게 해줘요.

더 알아보기 (Learn more)

cppreference