Использование аргумента шаблона 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
используется вis_assignable
черта характера:
Хотя полученный код был значительно более понятен, чем исходный, нам не понравился описанный выше интерфейс обнаружения, посколькуvoid
Аргумент в вызове метафункции - это деталь реализации, которая не должна попадать в клиентский код.
Тем не менееvoid
не имеет никакого смысла для меня в первую очередь. Если я попытаюсь использовать эту черту типа, чтобы обнаружить,int
можно назначить копию, я получаюstd::false_type
демонстрация.
Если я переписатьis_assignable
как:
template< class T >
using
is_assignable = detect<T, assign_t>;
Что имеет больше смысла для меня, тогда черта, кажется, работает правильно:демонстрация
Итак, мой вопрос здесьЯ что-то неправильно понимаю в этом документе, или это просто опечатка?
Если онобыло опечатка, тогда я не понимаю, почему авторы чувствовали необходимость обсудить, как им не понравилосьvoid
вытекает, что делает меня почти уверенным, что я что-то упускаю.