Was sind die Gründe für die Existenz von std::decay
? In welchen Situationen ist das std::decay
sinnvoll?
c++
c++11
standard-library
Eric Javier Hernandez Saura
quelle
quelle
decay_t<decltype(...)>
ist eine schöne Kombination, um zu sehen, wasauto
sich daraus ergeben würde.Antworten:
<joke> Es wird offensichtlich verwendet, um radioaktive
std::atomic
Typen in nicht radioaktive zu zerlegen. </ witz>N2609 ist das vorgeschlagene Papier
std::decay
. Das Papier erklärt:Das motivierende Beispiel ist C ++ 03
std::make_pair
:die ihre Parameter nach Wert akzeptierte, damit String-Literale funktionieren:
Wenn es seine Parameter als Referenz akzeptiert hat,
T1
wird es als Array-Typ abgeleitet und anschließend a erstelltpair<T1, T2>
schlecht geformt.Dies führt jedoch offensichtlich zu erheblichen Ineffizienzen. Daher ist es erforderlich
decay
, den Satz von Transformationen anzuwenden, der beim Übergeben von Werten auftritt, damit Sie die Effizienz der Referenzübernahme der Parameter erhalten und dennoch die Typtransformationen erhalten, die für die Arbeit Ihres Codes mit Zeichenfolgenliteralen erforderlich sind. Array-Typen, Funktionstypen und dergleichen:Hinweis: Dies ist nicht die eigentliche C ++ 11-
make_pair
Implementierung. C ++ 11make_pair
entpackt auchstd::reference_wrapper
s.quelle
Wenn Sie mit Vorlagenfunktionen arbeiten, die Parameter eines Vorlagentyps verwenden, haben Sie häufig universelle Parameter. Universelle Parameter sind fast immer Referenzen der einen oder anderen Art. Sie sind auch konstant flüchtig qualifiziert. Daher funktionieren die meisten Typmerkmale nicht wie erwartet:
http://coliru.stacked-crooked.com/a/24476e60bd906bed
Die Lösung hier ist zu verwenden
std::decay
:http://coliru.stacked-crooked.com/a/8cbd0119a28a18bd
quelle
decay
ist sehr aggressiv, z. B. wenn es auf eine Referenz auf ein Array angewendet wird, ergibt es einen Zeiger. Es ist normalerweise zu aggressiv für diese Art der Metaprogrammierung IMHO.remove_const_t< remove_reference_t<T> >
möglicherweise eine benutzerdefinierte Metafunktion einschließen.