Uso do argumento void template na implementação do idioma de detecção precoce

Non4502 os autores descrevem uma implementação precoce do idioma de detecção que encapsula ovoid_t truque. Aqui está sua definição, juntamente com o uso para definir uma característica parais_assignable (realmente é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>;

Eles mencionam que não gostam disso por causa davoid usado nois_assignable traço:

Embora o código resultante seja significativamente mais compreensível que o original, não gostamos da interface de detecção acima, porque ovoid O argumento na chamada de metafunção é um detalhe de implementação que não deve vazar para o código do cliente.

No entanto, ovoid não faz nenhum sentido para mim em primeiro lugar. Se eu tentar usar esse tipo de característica para detectar seint é cópia atribuível, eu recebostd::false_type Demo.

Se eu reescreveris_assignable Como:

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

O que faz mais sentido para mim, então a característica parece funcionar corretamente:Demo

Então, minha pergunta aqui éEstou entendendo mal algo neste documento ou foi simplesmente um erro de digitação?

Se issoestava um erro de digitação, então eu não entendo por que os autores sentiram a necessidade de discutir como eles não gostavamvoid vazando, o que me dá certeza de que estou perdendo alguma coisa.

questionAnswers(1)

yourAnswerToTheQuestion