Bewährtes Verfahren zum Deklarieren von Variablen ohne Initialisierung, daher ist auto nicht verfügbar

8

Ich möchte zwei Variablen desselben Typs deklarieren und den Compiler die Typen herausfinden lassen. Ich möchte jedoch eine der Variablen erst später initialisieren. Ich denke nicht, dass ich auto hier verwenden kann, also was ist die beste Option?

%Vor%

Was ist der beste Weg, dem Compiler mitzuteilen, dass end vom selben Typ sein soll wie start , aber ohne die Variable initialisieren zu müssen?

%Vor%

Aktualisieren

Ein paar Kommentare haben Wege vorgeschlagen, die in bestimmten Situationen funktionieren würden, daher erläutere ich meine Situation hier:

%Vor%

Ich glaube, eine Lambda-Funktion wäre hier schwieriger, weil amount auf 0 zurückgesetzt wird, nachdem end berechnet wurde, also in einer Lambda-Funktion, die einen Wert für end , amount = 0 berechnet um nach der return Aussage zu kommen. Die einzige Möglichkeit wäre, mehr lokale Variablen zu erstellen, was eine (zugegebenermaßen winzige) Leistungseinbuße zur Folge hätte.

    
Malvineous 11.02.2015, 10:06
quelle

5 Antworten

10

Mein persönlicher Ansatz wäre, ein Lambda an Ort und Stelle zu nennen:

%Vor%

Wenn der automatische Rückgabetypabzug für das Lambda aus irgendeinem Grund fehlschlägt (z. B. gibt es mehrere return -Anweisungen), ersetzen Sie einfach [&]{ durch [&]() -> decltype(start) { .

Bearbeiten:

%Vor%     
ildjarn 11.02.2015, 10:35
quelle
9

Ich denke eine nicht initialisierte Variable ist hier eine vorzeitige Optimierung. Ich würde die Variable initialisieren und nur dann eine Optimierung in Erwägung ziehen, wenn ich Beweise dafür habe, dass dies Auswirkungen hat.

%Vor%     
Chris Drew 11.02.2015 11:12
quelle
6

Hier ist ein Beispiel mit dem guten alten ternären Operator (auch von @ 5gon12eder erwähnt). In solch einem einfachen Fall ist es die beste verständliche IMHO und vermeidet auch die Probleme von nicht initialisierten Variablen, auf die @ildjarn hingewiesen hat.

%Vor%     
winnetou 11.02.2015 14:30
quelle
5
%Vor%     
Maxim Egorushkin 11.02.2015 10:28
quelle
5

Ist es nicht übertrieben das Problem? Gehen Sie entweder zu Ihrer ersten Intuition:

%Vor%

Oder auto - initialisieren Sie die end Variable mit v.end() und löschen Sie die else Klausel in Ihrem Democode. So einfach ist das:

%Vor%

Die Kosten für die Initialisierung oder Zuweisung eines Iterators sollten im Vergleich zu den Wartungs- / Lesbarkeitskosten ohnehin vernachlässigbar sein.

    
HiroshimaCC 11.02.2015 20:26
quelle

Tags und Links