Wie erwartet gibt der Compiler (VisualStudio 2008) eine Warnung aus
Warnung C4715: „doSomethingWith“: Nicht alle Steuerpfade geben einen Wert zurück
beim Kompilieren des folgenden Codes:
int doSomethingWith(int value)
{
int returnValue = 3;
bool condition = false;
if(condition)
// returnValue += value; // DOH
return returnValue;
}
int main(int argc, char* argv[])
{
int foo = 10;
int result = doSomethingWith(foo);
return 0;
}
Aber das Programm läuft einwandfrei. Der Rückgabewert der Funktion doSomethingWith() ist 0.
Ist nur ein undefiniertes Verhalten oder gibt es eine bestimmte Regel, wie der Ergebniswert zur Laufzeit erstellt/berechnet wird. Was passiert mit Nicht-POD-Datentypen als Rückgabewert?
Es handelt sich um ein undefiniertes Verhalten, wie im Abschnitt 6.6.3 des ISO-C++-Standards angegeben:
Das Abfließen vom Ende einer Funktion ist gleichbedeutend mit einer Rückgabe ohne Wert; dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion.
Bei x86-Prozessoren legt die Standard-Aufrufkonvention den Rückgabewert in das EAX-Register. Praktisch bedeutet dies, dass für die meisten Compiler das Ergebnis der letzten mathematischen Operation zurückgegeben wird, wenn wir das Ende der Funktion ohne Rückkehr erreichen. Allerdings kann man sich nicht darauf verlassen und es ist nicht tragbar.
http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
Antwort von @piotr aktualisieren.
Von dem C++17-Standard Abschnitt 9.6.3
Abfließen des Endes eines Konstruktors, eines Destruktors oder einer Funktion mit a Lebenslauf Der Rückgabetyp void entspricht einer Rückgabe ohne Operanden. Andernfalls führt das Abfließen vom Ende einer anderen Funktion als main (6.6.1) zu undefiniertem Verhalten.
Das Zurückgeben eines Werts von einer Wert zurückgebenden Funktion führt zu undefiniertem Verhalten.
Schauen Sie sich diese Antwort an: stackoverflow.com/questions/1610030/…
– Fernando N.
8. April 2010 um 7:48 Uhr
@fnieto: Ah, ich verstehe, das ist eine sehr gute Antwort. Habe es aber selbst nicht gefunden, bevor ich gefragt habe…
– nabulke
8. April 2010 um 7:52 Uhr