Использование аргумента шаблона void в реализации идиома раннего обнаружения

Вn4502 авторы описывают раннюю реализацию идиомы обнаружения, которая инкапсулируетvoid_t трюк. Вот его определение наряду с использованием для определения чертыis_assignable (на самом деле этоis_copy_assignable)

template<class...>
using void_t = void;

// primary template handles all types not supporting the operation:
template< class, template<class> class, class = void_t< > >
struct
detect : std::false_type { };
// specialization recognizes/validates only types supporting the archetype:
template< class T, template<class> class Op >
struct
detect< T, Op, void_t<Op<T>> > : std::true_type { };

// archetypal expression for assignment operation:
template< class T >
using
assign_t = decltype( std::declval<T&>() = std::declval<T const &>() );

// trait corresponding to that archetype:
template< class T >
using
is_assignable = detect<void, assign_t, T>;

Они упоминают, что им не нравится это из-заvoid&nbsp;используется вis_assignable&nbsp;черта характера:

Хотя полученный код был значительно более понятен, чем исходный, нам не понравился описанный выше интерфейс обнаружения, посколькуvoid&nbsp;Аргумент в вызове метафункции - это деталь реализации, которая не должна попадать в клиентский код.

Тем не менееvoid&nbsp;не имеет никакого смысла для меня в первую очередь. Если я попытаюсь использовать эту черту типа, чтобы обнаружить,int&nbsp;можно назначить копию, я получаюstd::false_type демонстрация.

Если я переписатьis_assignable&nbsp;как:

template< class T >
using
is_assignable = detect<T, assign_t>;

Что имеет больше смысла для меня, тогда черта, кажется, работает правильно:демонстрация

Итак, мой вопрос здесьЯ что-то неправильно понимаю в этом документе, или это просто опечатка?

Если онобыло&nbsp;опечатка, тогда я не понимаю, почему авторы чувствовали необходимость обсудить, как им не понравилосьvoid&nbsp;вытекает, что делает меня почти уверенным, что я что-то упускаю.