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

Mit GCC 4.8.0 veröffentlicht, wir haben einen compiler unterstützt die automatische Rückgabetyp Abzug, Teil von C++14. Mit -std=c++1y, ich kann dies tun:

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

Meine Frage ist: Wann sollte ich diese Funktion nutzen? Wenn ist es nötig und Wann macht es code cleaner?

Szenario 1

Ersten Szenario, das ich denken kann ist, Wann immer möglich. Jede Funktion, die geschrieben werden können, auf diese Weise sein sollte. Das problem mit diesem ist, dass es vielleicht nicht immer machen den code lesbarer zu gestalten.

Szenario 2

Nächsten Szenario zu vermeiden, komplexere Typen zurückgegeben. Als ein 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 jemals wirklich ein problem, aber ich denke, dass der Rückgabetyp explizit abhängig von den Parametern könnte klarer sein in einigen Fällen.

Szenario 3

Nächsten, zu verhindern Redundanz:

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 nur return {5, 6, 7}; im Ort ein Vektor, aber das funktioniert nicht immer und wir müssen Sie die Art sowohl in der Funktion header und den Rumpf der Funktion. Dies ist rein überflüssig, und die automatische Rückgabetyp Abzug rettet uns vor, dass Redundanz.

Szenario 4

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

auto position() {
    return pos_;
}

auto area() {
    return length_ * width_;
}

Manchmal, obwohl, betrachten wir die Funktion, wissen zu wollen, den genauen Typ, und wenn nicht, vorausgesetzt, wir haben zu gehen zu einem anderen Punkt im code, wie, wo pos_ deklariert ist.

Abschluss

Mit diesen Szenarien gelegt, welche von Ihnen tatsächlich beweisen, um eine situation, wo diese Funktion ist hilfreich bei der code-Reiniger? Was ist mit Szenarien, die ich versäumt haben, um Sie hier zu erwähnen? Welche Vorsichtsmaßnahmen sollte ich treffen, bevor Sie diese Funktion verwenden, so dass es nicht Biss mich später? Gibt es etwas neues in dieser Funktion bringt auf den Tisch, dass das nicht geht ohne es?

Beachten Sie, dass mehrere Fragen, die dazu gedacht sind, eine Hilfe bei der Suche nach Perspektiven, aus denen diese zu beantworten.

Kommentar zu dem Problem
Wunderbare Frage! Während Sie sich Fragen, welche Szenarien machen den code "besser", ich bin auch gefragt, welche Szenarien wird es schlimmer. Kommentarautor: Drew Dormann
@DrewDormann, Das ist was ich wundere mich, wie gut. Ich mag machen Gebrauch von neuen Funktionen, aber zu wissen, Wann Sie zu verwenden und Wann nicht, ist sehr wichtig. Es ist eine Zeit, in der neue Funktionen entstehen, die nehmen wir, um dies herauszufinden, also machen wir es jetzt so, dass wir bereit sind, wenn es darum geht, offiziell 🙂 Kommentarautor: chris
@NicolBolas, Vielleicht, aber die Tatsache, dass es in einer tatsächlichen Freisetzung von einem compiler wäre jetzt genug für die Menschen zu beginnen, es in persönlichen code (es hat auf jeden Fall fern gehalten werden von den Projekten an dieser Stelle). Ich bin einer von den Menschen, die gern mit den neuesten möglichen Funktionen in meinem eigenen code, und während ich nicht wissen, wie gut der Vorschlag ist mit dem Ausschuss, ich denke, die Tatsache, dass es die erste in diesem neuen option etwas sagt. Es wäre vielleicht besser für später überlassen, oder (ich weiß nicht, wie gut es funktionieren würde) wiederbelebt, wenn wir sicher wissen, dass es kommt. Kommentarautor: chris
@NicolBolas, Wenn es hilft, es ist verabschiedet worden, jetzt :p Kommentarautor: chris
Die aktuellen Antworten scheinen nicht zu erwähnen, dass die Ersetzung des ->decltype(t+u) mit auto-Abzug tötet SFINAE. Kommentarautor: Marc Glisse

InformationsquelleAutor der Frage chris | 2013-04-01

Schreibe einen Kommentar