Was sind einige Anwendungen von 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?
InformationsquelleAutor der Frage 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 gebenohne 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 Abzugnachdem 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:
InformationsquelleAutor der Antwort 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 Wrapperwo 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.
InformationsquelleAutor der Antwort 101010