Frage zum Standard: Rückgabewerte von Funktionen



  • Hi,

    ist dass hier laut Standard zulässig?

    int setText(const std::string t) 
    { 
    	text = t;
    }
    

    Ich dachte eigentlich immer, dass Funktionen die nicht void sind, auch einen Wert zurückliefern müssen. Der M$VC-Compiler sagt das auch aber der gcc zum Beispiel nicht. Also was ist richtig?



  • MSVC hat Recht. Eine int-Funktion muss immer int zurückgeben. Dein Code ist nicht standardzulässig.



  • Fairerweise sollte man allerdings hinzufügen dass der g++ immerhin eine Warnung ausspuckt.



  • MSVC hat Recht. Eine int-Funktion muss immer int zurückgeben. Dein Code ist nicht standardzulässig.

    Könntest du das bitte belegen? Ich habe gerade im Standard geforscht und komme zu folgendem Ergebnis (6.6.3/2):
    1. Eine Funktion, die laut Deklaration einen Wert liefert, produziert undefiniertes Verhalten, wenn sie normal beendet wird (ohne Exception), aber ein passendes return-statement fehlt.

    2. Ein fehlendes return-statement muss aber weder zu einem Fehler noch zu einer Warnung führen -> der Standard fordert keine Diagnose.
    Grund dafür ist, dass ein fehlendes return-statement nicht einfach nachgewiesen werden kann:

    int foo()
    {
    throw bla();
    }
    

    Hier fehlt auf den ersten Blick auch ein return-Statement. Der Code ist aber völlig legal, da die Funktion niemals auf normalem Wege verlassen werden kann.



  • Ich verlass mich nie mehr auf irgendwelche Lehrbücher



  • Danke für die Nachforschung!
    Interpretiere ich das richtig wenn ich sage, dass es nicht zulässig ist laut Standard aber der Compiler sich darum nicht zu kümmern braucht, sondern das ganze mehr in der Hand des Programmierers liegt?



  • Da gefällt mir aber die Vorgehensweise vom MS VC++ Compiler aber wesentlich besser. Undefiniertes Verhalten ist ja wohl das krasseste überhaupt, wenn man in einem komplexen Programm nen Fehler sucht.

    Nachtrag: Ich sehe grad, dass VC++ auch nicht unbedingt einen Rückgabewert erzwingt. Bei Verzweigungen warnt er auch nur, dass nicht alle Pfade einen Wert zurückgeben.


Anmelden zum Antworten