std::hash<std::unique_ptr>
From cppreference.com
< cpp | memory | unique ptr
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Memory management library
(exposition only*)
(C++11)
(C++23)
(C++11)
(C++17)
(C++11)
(C++11)
(C++20)
(C++20)
(C++17)
(C++11)
(C++17)
(C++20)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
Uninitialized storage (until C++20)
(until C++20*)
(until C++20*)
(until C++20*)
Garbage collector support (until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)
(C++11)
(C++17)
(C++20)
(C++17)
(C++11)
(C++11)
(C++11)
(until C++17*)
(C++11)
(C++17)
(C++26)
(C++26)
(C++11)
(C++11)
(C++11)
(C++23)
(C++23)
(C++11)
(C++20)
(C++11)
(C++11)
(C++20)
(C++26)
std::unique_ptr
(C++14)(C++20)
(until C++20)(C++20)
(C++20)
hash<std::unique_ptr>
template< class T, class Deleter >
struct hash<std::unique_ptr <T, Deleter>>;
(since C++11)
struct hash<std::unique_ptr <T, Deleter>>;
The template specialization of std::hash for std::unique_ptr <T, Deleter> allows users to obtain hashes of objects of type std::unique_ptr <T, Deleter>.
The specialization std::hash <std::unique_ptr <T,D>> is enabled (see std::hash ) if std::hash <typename std::unique_ptr <T,D>::pointer> is enabled, and is disabled otherwise.
When enabled, for a given std::unique_ptr <T, D> p, this specialization ensures that std::hash <std::unique_ptr <T, D>>()(p) == std::hash <typename std::unique_ptr <T, D>::pointer>()(p.get()).
The member functions of this specialization are not guaranteed to be noexcept because the pointer may be a fancy pointer and its hash might throw.
[edit] Example
Run this code
#include <functional> #include <iostream> #include <memory> struct Foo { Foo(int num) : nr(num) { std::cout << "Foo(" << nr << ")\n"; } ~Foo() { std::cout << "~Foo()\n"; } bool operator==(const Foo &other) const { return nr == other.nr; }; int nr; }; int main() { std::cout << std::boolalpha << std::hex ; Foo* foo = new Foo(5); std::unique_ptr <Foo> up(foo); std::cout << "hash(up): " << std::hash <std::unique_ptr <Foo>>()(up) << '\n' << "hash(foo): " << std::hash <Foo*>()(foo) << '\n' << "*up==*foo: " << (*up == *foo) << "\n\n"; std::unique_ptr <Foo> other = std::make_unique <Foo>(5); std::cout << "hash(up): " << std::hash <std::unique_ptr <Foo>>()(up) << '\n' << "hash(other): " << std::hash <std::unique_ptr <Foo>>()(other) << '\n' << "*up==*other: " <<(*up == *other) << "\n\n"; }
Possible output:
Foo(5) hash(up): acac20 hash(foo): acac20 *up==*foo: true Foo(5) hash(up): acac20 hash(other): acbc50 *up==*other: true ~Foo() ~Foo()