2014-12-26 6 views
12

decltype(auto) kann einen Wert und eine Referenz ableiten. auto leitet niemals eine Referenz ab. Es klingt für mich generischen Code und Optimierung decltype(auto) sollte immer bevorzugt werden. Ist das der Fall? Betrachten wir zum Beispiel ein Objekt, das kopierbar sein kann oder nicht. auto& ist erforderlich, um zu vermeiden, dass es kopiert wird, aber das zwingt es, immer eine Referenz zu sein. decltype(auto) ist in diesem Fall die richtige Option. Was sind die Nachteile von decltype(auto) neben mehr Tipparbeit?Fast immer declltype (auto)?

+3

Wenn die Antwort unten * beantwortet * Ihre Frage, die Art und Weise Stack-Überlauf funktioniert, dann werden Sie, indem Sie auf das Häkchen neben ihm die Antwort „akzeptieren“. Mehr [hier] (/ Hilfe/jemand-Antworten). Wenn nicht, poste vielleicht einen Kommentar zu der Frage, um Klärung zu bitten. –

Antwort

9

Vom isocpp C++ 14 FAQ auf decltype(auto):

Hinweis: decltype (auto) ist in erster Linie nützlich für den Rückgabetyp von Weiterleitungsfunktionen und ähnlichen Wrapper herzuleiten, wie oben gezeigt, in dem Sie das wollen Geben Sie ein, um bestimmte Ausdrücke, die Sie aufrufen, genau zu "verfolgen". Declltype (auto) ist jedoch nicht dazu gedacht, weit verbreitetes Feature zu sein. Insbesondere, obwohl es zum Deklarieren lokaler Variablen verwendet werden kann, ist dies wahrscheinlich nur ein Antipattern, da eine Referenzvariable einer lokalen Variablen nicht vom Initialisierungsausdruck abhängen sollte. Außerdem ist es empfindlich, wie Sie die Return-Anweisung schreiben. Diese beiden Funktionen haben unterschiedliche Rückgabetypen. look_up_a_string_1 gibt eine string zurück, während look_up_a_string_2 eine string& zurückgibt.

decltype(auto) look_up_a_string_1() { auto str = lookup1(); return str; } 
decltype(auto) look_up_a_string_2() { auto str = lookup1(); return(str); }