Was sind einige Möglichkeiten, decltype(auto)?
In c++14 den decltype(auto)
idiom eingeführt.
In der Regel seine Verwendung ist für ermöglichen auto
Erklärungen zur Verwendung der decltype
Regeln, die auf dem gegebenen Ausdruck.
Suche für Beispiele von "guten" Gebrauch der Redewendung kann ich nur denken, Dinge wie die folgenden (von Scott Meyers), nämlich für eine Funktion Rückgabetyp Abzug:
template<typename ContainerType, typename IndexType> //C++14
decltype(auto) grab(ContainerType&& container, IndexType&& index)
{
authenticateUser();
return std::forward<ContainerType>(container)[std::forward<IndexType>(index)];
}
Gibt es andere Beispiele, wo dieses neue feature sinnvoll ist?
dieser post im Grunde schlage vor, zu versuchen zu vermeiden, dieses idiom, weil, wenn Sie es verwenden, geben Sie weniger Optionen zur Optimierung Ihres Compilers stackoverflow.com/a/20092875/2485710
Ich habe einmal verwendet
nicht sicher, ob es über die Optimierung speziell, mehr Potenzial für Unfälle, wenn
Ich habe einmal verwendet
decltype(auto)
für so etwas wie template<class U, V> decltype(auto) first(std::pair<U, V>& p) { return p.first; }
, obwohl ich dann erkannte, dass ich hatte, zu verwenden return (p.first);
was erstaunlicherweise funktioniert (aber IIRC ist dies sogar beabsichtigt).nicht sicher, ob es über die Optimierung speziell, mehr Potenzial für Unfälle, wenn
decltype(auto)
können bewirken, dass etwas kopiert werden/verschoben werden, in dem deklarierten Objekt -, Zähler-Erwartung.InformationsquelleAutor Nikos Athanasiou | 2014-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rückgabetyp Weiterleitung in generischen code -
Für nicht-generischer code wie im ersten Beispiel, das Sie Gaben, können Sie Sie manuell auswählen, um eine Referenz als return-Typ:
aber in generischen code - Sie wollen in der Lage sein, um perfekt vorwärts, einen zurück geben, ohne zu wissen, ob es sich um eine Referenz oder einen Wert.
decltype(auto)
gibt Ihnen die Möglichkeit:Verzögerung Rückgabetyp Abzug in rekursiven templates
Indieses Q&A vor ein paar Tagen, eine unendliche Rekursion bei template-Instanziierung wurde gefunden, wenn der Rückgabetyp der Vorlage angegeben wurde als
decltype(iter(Int<i-1>{}))
stattdecltype(auto)
.decltype(auto)
wird hier verwendet, um Verzögerung der Rückgabetyp Abzug, nachdem sich der Staub der template-Instanziierung niedergelassen hat.Anderen verwendet
Können Sie auch
decltype(auto)
in anderen Kontexten, z.B. dem Norm-Entwurf N3936 auch Staaten7.1.6.4 auto-Planer [dcl.spec.auto]
Der Entwurf enthält auch dieses Beispiel von der Initialisierung der Variablen:
(i)
vsi
eine neue Sache, die in C++14?und
decltype((expr))
werden verschiedene in C++11 schon, dieser Satz verallgemeinert dieses Verhalten.Ich habe gerade gelernt, das, fühlt sich wie eine schreckliche design-Entscheidung... hinzufügen eine pünktliche nuance der syntax, die Bedeutung von Klammern.
siehe auch stackoverflow.com/q/24116817/819272
Das Beispiel, das immer eine Meldung, dass dieser Ekel ist die one-liner-Datei-zu-string-syntax (siehe auch link). Jedes Teil scheint es rückwärts. Sie könnten nicht erwarten, dass die Zweideutigkeit an alle, und entfernen Sie redundante Klammern aus einer Probe, die zwanghaft; Sie erwarten würde, die Mehrdeutigkeit zu beheben, indem Sie den Prozess der Beseitigung nach SFINAE, aber Möchtegern-Kandidaten, die andere als die Erklärung beseitigt sind, im Voraus (SFistAE); und in der frustration, die Sie bewegen, sobald es kompiliert wird, denken die willkürliche Klammern lösen Zweideutigkeit, aber Sie Einführung. Am meisten ärgerlich für CS101 Professoren ich mir vorstellen.
InformationsquelleAutor TemplateRex
Zitieren Sachen aus hier:
decltype(auto)
ist in Erster Linie nützlich für Aufzucht der return-Typ von der Spedition Funktionen und ähnliche Wrapper, wo Sie wollen, dass der Typ genau "verfolgen" einige Ausdruck Sie sind, aufrufen.Zum Beispiel gegeben sind die folgenden Funktionen:
Jedoch
decltype(auto)
ist nicht vorgesehen, um eine weit verbreitete Funktion, die darüber hinaus.Insbesondere, obwohl es kann verwendet werden, um lokale Variablen deklarieren,, tun, dass ist wahrscheinlich nur ein antipattern, da eine lokale variable, die die Referenz-ness, sollte nicht davon abhängen, ob die Initialisierung Ausdruck.
Auch, es ist empfindlich, um, wie Sie schreiben, die return-Anweisung.
Zum Beispiel die beiden folgenden Funktionen haben unterschiedliche Rückgabe-Typen:
string
, die zweite gibtstring&
, die einen Verweis auf die lokale variablestr
.Aus der Vorschlag Sie können sehen, weitere Verwendungszwecke.
auto
für die Rückkehr?konnte mit der Arbeit verallgemeinert Rückgabetyp Abzug (d.h.,
auto
zurück), aber der OP fragte, die speziell für den Gebrauch vondecltype(auto)
.Die Frage ist immer noch relevant, obwohl. Was wäre der Rückgabetyp von
auto lookup_a_string() { ... }
? Ist es immer ein nicht-Referenz-Typ? Und deshalbauto lookup_a_string() ->decltype(auto) { ... }
ist notwendig, um Kraft, um können Verweise zu werden (in einigen Fällen) zurückgegeben?Selbstbehalt
auto
ist definiert in den Begriff des pass-by-value-Vorlage, also ja, es kann nicht ein Hinweis. Bitte-wartenauto
kann alles sein, einschließlich ein Referenz -, natürlich.Ein weiteres Beispiel erwähnenswert ist die Rückkehr ein element einer
std::vector
. Sagen Sietemplate<typename T> struct S { auto & operator[](std::size_t i) { return v[i]; } std::vector<T> v; }
. DannS<bool>::operator[]
zurück baumelnde Verweise wegen der Spezialisierung derstd::vector<bool>
. Ändern Sie den Rückgabetyp zudecltype(auto)
umgeht dieses problem.InformationsquelleAutor 101010