Wann sollte ich den automatischen Rückgabetyp-Abzug in C ++ 14 verwenden?

Mit GCC 4.8.0 haben wir einen Compiler, der die automatische Rückgabetypermittlung in C ++ 14 unterstützt. Mit-std=c++1y, Ich kann dies tun:

auto foo() { //deduced to be int
    return 5;
}

Meine Frage ist: Wann sollte ich diese Funktion verwenden? Wann ist es notwendig und wann macht es den Code sauberer?

Szenario 1

Das erste Szenario, an das ich denken kann, ist, wann immer es möglich ist. Jede Funktion, die auf diese Weise geschrieben werden kann, sollte es sein. Das Problem dabei ist, dass der Code dadurch möglicherweise nicht immer besser lesbar wird.

Szenario 2

Das nächste Szenario besteht darin, komplexere Rückgabetypen zu vermeiden. Als sehr leichtes Beispiel:

template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
    return t + u;
}

Ich glaube nicht, dass das jemals wirklich ein Problem sein würde, obwohl ich denke, dass es in einigen Fällen klarer sein könnte, wenn der Rückgabetyp explizit von den Parametern abhängt.

Szenario 3

Weiter, um Redundanz zu vermeiden:

auto foo() {
    std::vector<std::map<std::pair<int, double>, int>> ret;
    //fill ret in with stuff
    return ret;
}

In C ++ 11 können wir manchmal nurreturn {5, 6, 7}; anstelle eines Vektors, aber das funktioniert nicht immer und wir müssen den Typ sowohl im Funktionsheader als auch im Funktionskörper angeben. Dies ist rein redundant, und die automatische Abbuchung von Rückgabetypen erspart uns diese Redundanz.

Szenario 4

Schließlich kann es anstelle von sehr einfachen Funktionen verwendet werden:

auto position() {
    return pos_;
}

auto area() {
    return length_ * width_;
}

Manchmal schauen wir uns jedoch die Funktion an und möchten den genauen Typ wissen. Wenn er dort nicht angegeben ist, müssen wir zu einem anderen Punkt im Code gehen, z. B. wopos_ wird deklariert.

Fazit

Welche dieser Szenarien erweist sich als eine Situation, in der diese Funktion hilfreich ist, um den Code übersichtlicher zu gestalten? Was ist mit Szenarien, die ich hier nicht erwähnt habe? Welche Vorsichtsmaßnahmen sollte ich treffen, bevor ich diese Funktion verwende, damit sie mich später nicht beißt? Gibt es etwas Neues, das diese Funktion auf den Tisch bringt und das ohne sie nicht möglich ist?

Beachten Sie, dass die mehreren Fragen eine Hilfe bei der Suche nach Perspektiven sind, aus denen diese beantwortet werden können.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage