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


Ответы (0 шт):