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.