Разница между std::same_as и std::is_same

Я читал документацию std::same_as и похоже, что она просто перенаправляется на std::is_same_v. cppreference имеет следующий пример реализации:

namespace detail {
    template< class T, class U >
    concept SameHelper = std::is_same_v<T, U>;
}
 
template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

Почему && вообще необходимо, если std::is_same_v коммутативно? А если std::same_as имеет одинаковую семантику, то зачем мне это? Я также могу использовать std::is_same_v в качестве ограничения следующим образом:

template <typename T>
void test(T x) requires std::is_same_v<T, int> {}

person Jan Schultke    schedule 04.09.2020    source источник