Сравнение двух одинаковых типов из remove_reference возвращает false, при этом работает с remove_reference_t
Написал такой код, чтобы проверять, является ли тип T
каким-либо указателем (сырым или смарт-указателем):
template <class T>
concept is_any_pointer =
std::is_pointer_v<T> ||
std::is_same_v<
std::remove_reference<decltype((*std::declval<T>()))>::type,
std::remove_reference<decltype((*(std::declval<T>().operator->())))>::type
>;
При этом is_any_pointer<std::shared_ptr<int>>
возвращает false
, хотя типы, переданные в is_same_v
одинаковы.
Но если переделать так:
template <class T>
concept is_any_pointer =
std::is_pointer_v<T> ||
std::is_same_v<
std::remove_reference_t<decltype((*std::declval<T>()))>,
std::remove_reference_t<decltype((*(std::declval<T>().operator->())))>
>;
is_any_pointer<std::shared_ptr<int>>
возвращает true
.
Пожалуйста, объясните разницу между этими двумя случаями, если remove_reference_t<...>
– это и есть remove_reference<...>::type
.