Frage zu const Rückgabewert



  • Hallo, ich bin neu in C++ und habe eine Frage zu const Rückgabewerten. Gibt es einen unterschied zwschen folgenden zwei Funktionen?

    const int funktion(int a)
    {
    	//etwas mit a machen
    	return a;
    }
    
    int funktion(int a)
    {
    	//etwas mit a machen
    	return a;
    }
    

    Ich frage deshalb, weil ja beide Rückgabewerte nicht als LValue dienen können und nur "temporär" erhalten bleiben.
    Gibt es einen Unterschied zwischen beiden Return Werten? Wirkt sich das in irgendeiner Weise auf die Performance aus (in umfangreicheren Funktionen natürlich 😉 )? Und welche Variante wird meistens genutzt (reine Stilfrage?) ?

    Mfg



  • Anfänger _) schrieb:

    Gibt es einen Unterschied zwischen beiden Return Werten?

    Da die Rückgabewerte keine Zeiger oder Referenzen sind, nein, sie werden nach der Rückgabe ja selbst kopiert.

    Anfänger _) schrieb:

    Wirkt sich das in irgendeiner Weise auf die Performance aus (in umfangreicheren Funktionen natürlich 😉 )?

    Ich denke nicht das das eine Auswirkungen hat. const wird vom Compiler geprüft, inwiefern es irgendeine Bedeutung zur Laufzeit hat müsste mal jemand anders sagen der mehr Ahnung davon hat.

    Anfänger _) schrieb:

    Und welche Variante wird meistens genutzt (reine Stilfrage?) ?

    Ich nutze die Variante ohne const imer, da das const durch die Kopie bedeutungslos ist.



  • Xebov schrieb:

    Da die Rückgabewerte keine Zeiger oder Referenzen sind, nein, sie werden nach der Rückgabe ja selbst kopiert.

    nicht zwangsläufig:

    void foo(int& bla)
    { bla += 5; }
    
    const int bar()
    { return 6; }
    
    int main()
    {
      foo(bar());
    }
    

    compiliert nicht, weil der konstante Rückgabewert nicht an eine nichtkonstante Referenz gebunden werden kann.

    struct Z
    {
      int i;
      Z& bar()
      { i +=4; return *this; }
      void baz()
      { cout << i << endl; }
    };
    
    const Z foo()
    {
      Z z; z.i = 1; return z;
    }
    
    int main()
    {
      foo().bar().baz();
    }
    

    compiliert auch nur wegen des const nicht.



  • pumuckl schrieb:

    nicht zwangsläufig:

    void foo(int& bla)
    { bla += 5; }
    
    const int bar()
    { return 6; }
    
    int main()
    {
      foo(bar());
    }
    

    compiliert nicht, weil der konstante Rückgabewert nicht an eine nichtkonstante Referenz gebunden werden kann.

    Nein, nicht deswegen. Sondern weil ein RValue nicht an eine Non-Const-Referenz (die aber sehr wohl konstant ist) gebunden werden kann.

    int bar()
    { return 6; }
    

    Ginge ebenso nicht.

    Bei skalaren Typen macht es keinen Unterschied, ob der Rückgabewert const -qualifiziert ist oder nicht (RValues von skalaren Typen können grundsätzlich nicht verändert werden).


Anmelden zum Antworten