Describe the bug
The specialization of std::hash for gsl::not_null<std::shared_ptr<T>> does not compile in GSL version 4.2.0.
To Reproduce
#include <gsl/pointers>
void test()
{
std::hash<gsl::not_null<std::shared_ptr<int>>> hasher{};
}
Compilation Error
error C2280: 'gsl::not_null_hash<gsl::not_null<std::shared_ptr<int>>,const T &,false>::not_null_hash(void)': attempting to reference a deleted function
error C2280: with
error C2280: [
error C2280: T=std::shared_ptr<int>
error C2280: ]
GSL-4.2.0\include\gsl\pointers(244,5):
see declaration of 'gsl::not_null_hash<gsl::not_null<std::shared_ptr<int>>,const T &,false>::not_null_hash'
with
[
T=std::shared_ptr<int>
]
GSL-4.2.0\include\gsl\pointers(244,5):
'gsl::not_null_hash<gsl::not_null<std::shared_ptr<int>>,const T &,false>::not_null_hash(void)': function was explicitly deleted
with
[
T=std::shared_ptr<int>
]
Expected behavior
The specialization of std::hash for gsl::not_null<std::shared_ptr<T>> should compile successfully.
Spec:
- OS: Windows
- Compiler: MSVC 17.13.6
- C++ Version: C++20
Additional context
In the following template from <gsl/pointers>:
template <class T, class U = decltype(std::declval<const T&>().get()), 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()); }
};
it might be necessary to apply std::remove_cv_t<std::remove_reference_t<...>> to the type U to properly deduce the underlying type and avoid issues with const/reference qualifiers.
Describe the bug
The specialization of
std::hashforgsl::not_null<std::shared_ptr<T>>does not compile in GSL version 4.2.0.To Reproduce
Compilation Error
Expected behavior
The specialization of
std::hashforgsl::not_null<std::shared_ptr<T>>should compile successfully.Spec:
Additional context
In the following template from
<gsl/pointers>:it might be necessary to apply
std::remove_cv_t<std::remove_reference_t<...>>to the typeUto properly deduce the underlying type and avoid issues with const/reference qualifiers.