Value by reference



  • Sinner schrieb:

    mhm schrieb:

    er meint sinnlos, weil man es dann nicht wirklich als Referenz verwenden will, ...

    richtig...

    Aha !
    Merke: Wenn man schreibt, was man meint, wird man weniger mißverstanden.

    Gruß,

    Simon2.



  • Fellhuhn schrieb:

    Konstante Referenzen kann man auch verändern, dazu ist ja const_cast da. Also schon ein Unterschied. 😉

    Nein, dafür ist const_cast eben nicht da. Konstante Werte sollte man niemals ändern. const_cast hat vor allem die Bewandnis das man allte Schnittstellen (z.B. externe) verwenden kann wo - obwohl keine Änderung erfolgt - keine const-Deklaration statt gefunden hat.

    cu André



  • asc schrieb:

    ... Konstante Werte sollte man niemals ändern....

    Richtig. Aber man kann. Und daher ist es ein Unterschied. Habe ja nicht gesagt das man es soll. 😉



  • Fellhuhn schrieb:

    ...Aber man kann....

    ... und springt damit über die Grenzen des Standards hinaus in den weiten Raum "undefiniertes Verhalten".
    Mit Deiner Formulierung suggerierst Du aber Anderes.

    Genauso könnte ich sagen: "Pi kann man als 2 definieren".
    Da gilt auch: "Ja, man kann"
    .. aber eben auch: "Dann sollte man sich aber nicht darauf verlassen, dass alles Andere noch funktioniert/gilt"

    Gruß,

    Simon2.



  • Undefiniert? Das ist der Sinn von const_cast.



  • void f(int const& fi);
    
    int main() {
       const int i = 3;
       f(i);
       cout << i;
       return 0;
    }
    
    void f(int const& fi) {
       int& i = const_cast<int>(fi);
       i++;
    }
    

    undefiniert eben.

    Du hast geschrieben (in einer allgemeinen Diskussion über Schnittstellen):

    Fellhuhn schrieb:

    Konstante Referenzen kann man auch verändern, dazu ist ja const_cast da....

    ... und das stimmt einfach nicht.
    Stattdessen hat asc es gut auf den Punkt gebracht:

    asc schrieb:

    ...
    Nein, dafür ist const_cast eben nicht da. Konstante Werte sollte man niemals ändern. const_cast hat vor allem die Bewandnis das man allte Schnittstellen (z.B. externe) verwenden kann wo - obwohl keine Änderung erfolgt - keine const-Deklaration statt gefunden hat....

    ... und dieses "sollte man niemals ändern" ist nicht ein netter Design-Tipp unter Freunden, sondern eine andere Formulierung von "Ergebnis ist undefiniert".
    Manchmal ist "undefiniert" das geringere Übel und da ist const_cast das Mittel der Wahl, aber es ist nicht das generelle Mittel, um "... konstante Referenzen zu ändern ...".

    Gruß,

    Simon2.



  • Das ist kein Stück undefiniert. "Definierter" geht es gar nicht. Es mag in deinem Programm zu komischen Ergebnissen führen, die aber komplett dem Standard entsprechen.
    Das es absolut schlechter Stil ist, ist ganz was anderes. Aber zu behauptet eine konstante Referenz auf einen primitiven Datentyp und ein call by Value wäre identisch, ist absolut falsch.



  • Fellhuhn schrieb:

    Das ist kein Stück undefiniert.

    Doch, das ist undefiniert. 'const_cast' darf lt. Standard nur auf Werte angewandt werden, die nicht 'const' angelegt worden sind (ich bin zu faul, den genauen Wortlaut herauszusuchen). Wenn man 'i' also non-const deklariert hätte, wäre der Code wohldefiniert, sonst nicht. (Zumindest ist es bei Zeigern so, ob das auch für Referenzen gilt, weiß ich nicht.)



  • Fellhuhn schrieb:

    Das ist kein Stück undefiniert. "Definierter" geht es gar nicht.

    Nein. Es ist undefiniert. Das "entconsten" einer konstanten Variable (Beachte: Das Ursprungsobjekt ist konstant!) führt zu undefiniertem Verhalten. Punkt.

    Was Du wahrscheinlich meinst ist:

    void f(int const& fi);
    
    int main() {
       int i = 3; // KEIN const
       f(i);
       cout << i;
       return 0;
    }
    
    void f(int const& fi) {
       int& i = const_cast<int>(fi);
       i++;
    }
    

    BTW: Beim cast fehlt glaube ich ein & in den <>.



  • Ah, okay, sorry, das habe ich übersehen. Dann hast natürlich recht. Den Fall hatte ich komplett übersehen.


Anmelden zum Antworten