Сравнение двух одинаковых типов из 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.