Casting



  • huhu ihrs

    worin liegt der Unterschied zwischen beiden folgenden casts ?

    int u = 7;
    int i;
    i = (int&)u;
    i = (int) u;
    

    danke euch 🙂



  • Dweb schrieb:

    huhu ihrs

    worin liegt der Unterschied zwischen beiden folgenden casts ?

    int u = 7;
    int i;
    i = (int&)u;
    i = (int) u;
    

    danke euch 🙂

    Beide casts sind unnötig. (int&) ist sogar ein Fehler - du versuchst einen int in eie Referenz
    auf int zu casten und übergibst das an einen int - ist wiegesagt Quatsch.
    😉



  • joa quatsch ist es schon, wollte nur wissen wir man das Interpretiert, das hast du ja auch dann geschriebn 🙂

    Wilma schrieb:

    Einen int in eine Referenz auf int zu casten.

    Die Frage hab ich mir deswegen gestellt:

    const int ci = 7;
    int& ri  = const_cast<int&>(ci);    // geht
    int& ri2 = const_cast<int> (ci);    // geht nicht
    

    Darum wollt ich wissen worin der Unterschlied liegt^^
    Bzw. wieso geht 2teres nicht?



  • Dann haettest du gleich die richtige Frage stellen sollen. Ausgangsbeispiel und dein eigentliches Problem unterscheiden sich doch sehr. Mittels const_cast castet man das const weg, man kann nicht zwischen Typen umwandeln a la int -> int& .

    quatsch ist es schon, wollte nur wissen wir man das Interpretiert

    Man interpretiert es als das, was es ist: Quatsch. Dumme Frage ...



  • > int& ri2 = const_cast<int> (ci); // geht nicht

    Das geht nicht, da dieser cast ein temporäres Objekt vom Typ Integer zurückgibt. Temporäre Objekte können aber nicht an Lvalue-Referenzen gebunden werden.

    Edit: Fortsetzung: Da das Objekt am Ende des Befehls gelöscht wird. Somit würde die Referenz auf ein Objekt zeigen, dass es nicht mehr gibt. Deshalb verbietet es der Compiler gleich ganz. Vorsicht: Zeiger bieten diesen Schutz AFAIK nicht.



  • ah k thx @ Ad aCTa 🙂



  • Das steht direkt über dir...



  • Ad aCTa schrieb:

    Vorsicht: Zeiger bieten diesen Schutz AFAIK nicht.

    Echt? Ich hätte jetzt glatt gedacht, daß temporäre Objekte auch keine Adresse haben.



  • In dem Fall wäre als Adresse einfach der Wert des Ints genommen worden.



  • volkard schrieb:

    Ad aCTa schrieb:

    Vorsicht: Zeiger bieten diesen Schutz AFAIK nicht.

    Echt? Ich hätte jetzt glatt gedacht, daß temporäre Objekte auch keine Adresse haben.

    😃 👍



  • Wilma schrieb:

    Beide casts sind unnötig. (int&) ist sogar ein Fehler - du versuchst einen int in eie Referenz
    auf int zu casten und übergibst das an einen int - ist wiegesagt Quatsch.
    😉

    Steht der Smiley für Ironie? Was du sagst, stimmt jedenfalls nicht. Wenn man eine Referenz auf int nicht an int zuweisen könnte, wie sollte man denn dann jemals wieder auf den Wert, auf den die Referenz zeigt, zugreifen können?

    (int)u castet den Wert (R-Value) von u in den Typ int und erzeugt wieder einen Wert (R-Value). Diese kann man ganz einfach einem anderen int zuweisen.

    (int&)u castet den Ort (L-Value) von u in den Typ int& und erzeugt damit einen L-Value. Das heißt, man könnte das Ergebnis an eine Referenz zuweisen ( int& r = (int&)u; ), man könnte seine Adresse nehmen ( int* p = &(int&)u; ), man könnte es auf die linke Seite einer Zuweisung stellen ( (int&)u = 42; ). Und man kann selbstverständlich den L-Value in einen R-Value konvertieren (explizit: (int)(int&)u oder implizit: int i = (int&)u; ).


Anmelden zum Antworten