Fix std::hash compilation error for gsl::not_null<std::shared_ptr<T>> (#1210)

* Initial plan for issue

* Fix hash compilation issue for gsl::not_null with shared_ptr

Co-authored-by: carsonRadtke <10507970+carsonRadtke@users.noreply.github.com>

* Add comment explaining safe usage of typename T::element_type in not_null_hash

Co-authored-by: carsonRadtke <10507970+carsonRadtke@users.noreply.github.com>

* Initial plan for issue

* Remove upgrade_checklist.md file as requested

Co-authored-by: carsonRadtke <10507970+carsonRadtke@users.noreply.github.com>

* restore docs/upgrade_checklist.md

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: carsonRadtke <10507970+carsonRadtke@users.noreply.github.com>
Co-authored-by: Carson Radtke <carsonradtke@microsoft.com>
This commit is contained in:
Copilot
2025-12-05 10:00:06 -07:00
committed by GitHub
co-authored by carsonRadtke copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Carson Radtke
parent c31617f56a
commit 1883887359
2 changed files with 16 additions and 1 deletions
+2 -1
View File
@@ -231,7 +231,8 @@ template <class T>
not_null<T> operator+(std::ptrdiff_t, const not_null<T>&) = delete;
template <class T, class U = decltype(std::declval<const T&>().get()), bool = std::is_default_constructible<std::hash<U>>::value>
// T is conceptually a pointer so we don't have to worry about it being a reference and violating std::hash requirements
template <class T, class U = typename T::element_type, bool = std::is_default_constructible<std::hash<U>>::value>
struct not_null_hash
{
std::size_t operator()(const T& value) const { return std::hash<U>{}(value.get()); }
+14
View File
@@ -735,4 +735,18 @@ TEST(notnull_tests, TestStdHash)
EXPECT_FALSE(hash_nn(nn) == hash_intptr(&y));
EXPECT_FALSE(hash_nn(nn) == hash_intptr(nullptr));
}
{
auto x = std::make_shared<int>(42);
auto y = std::make_shared<int>(99);
not_null<std::shared_ptr<int>> nn{x};
const not_null<std::shared_ptr<int>> cnn{x};
std::hash<not_null<std::shared_ptr<int>>> hash_nn;
std::hash<std::shared_ptr<int>> hash_sharedptr;
EXPECT_TRUE(hash_nn(nn) == hash_sharedptr(x));
EXPECT_FALSE(hash_nn(nn) == hash_sharedptr(y));
EXPECT_TRUE(hash_nn(cnn) == hash_sharedptr(x));
}
}