W dokumencie n4502 autorzy opisują wczesną implementację idiomu wykrywania, który obejmuje sztuczkę void_t
. Oto jego definicja wraz z używania do definiowania cechę dla is_assignable
(naprawdę to is_copy_assignable
)Użycie pustego szablonu w implementacji identyfikatora wczesnego wykrywania
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>;
one wspomnieć, że nie podoba im się to ze względu na void
stosowanego w is_assignable
cechy:
Chociaż wynikowy kod był znacznie bardziej zrozumiały niż oryginał, nie znaliśmy powyższego interfejsu wykrywania, ponieważ argument metafunkcji jest szczegółem implementacji, który nie powinien przeciekać do kodu klienta.
Jednak void
nie ma dla mnie żadnego sensu. Jeśli spróbuję użyć tej cechy do wykrycia, czy można przypisać do kopii int
, otrzymam std::false_type
Demo.
Gdybym przepisać is_assignable
jak:
template< class T >
using
is_assignable = detect<T, assign_t>;
co sprawia, że więcej sensu dla mnie, wtedy pojawia się cecha, aby działać poprawnie: Demo
Więc moje pytanie jest tu Am I nieporozumienia coś w tym dokument, czy był to po prostu literówka?
Jeśli był literówka, to ja nie rozumiem, dlaczego autorzy czuł potrzebę omówienia nie lubili void
wycieka, co sprawia mi całkiem pewien, że jestem po prostu czegoś brakuje.
Poprzednik N4502, [N4436] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4436.pdf), ma jeszcze bardziej skandaliczne literówki (niepoprawna liczba argumentów szablonu). Więc inny zestaw literówek nie jest wykluczony ...; -] – ildjarn
Czy nie powinno to być 'using is_assignable = detect' zamiast? –
Rerito
@Rerito Nie sądzę, że konieczne jest końcowe "void". Wierzę, że przyczyną tego zamieszania jest literówka, jak sugeruje Ildjarn. Jak wspomina autor w przypisach do papieru, być może jest to "cienki" –