Frage zu const_cast



  • wollewausfander schrieb:

    man wuerde doch sowieso korrigieren, was auch ohne const_cast funktionieren wuerde, oder etwa nicht!?

    Das wäre toll, aber manchmal hast du nicht die Möglichkeit das zu korrigieren. z.B. weil es eine externe Bibliothek ist oder Ähnliches.

    Zu 2)

    struct xyz
    {
      int& get()
      {
        ...;
        return ...;
      }
    
      const int& get() const
      {
        return const_cast<xyz*>(this)->get();
      }
    };
    


  • Genau falschrum cooky.


  • Mod

    Beispiel zu b:

    const int* kompliziert(const int* i) { /* kompliziertes Zeug auf i, aber nicht auf *i */ return i;}
    
    int* kompliziert(int* i) {/* Wie die const-Version aufrufen, um den Code nicht zu wiederholen? So: */ return const_cast<int*>(kompliziert(const_cast<const int*>(i)));}
    

    Oder auch umgekehrt, wenn man sich ganz sicher ist, dass die non-const-Version den Pointee nicht verändert. Dann hat man jedoch keine Garantien vom Compiler für die Richtigkeit.

    Kommt selten vor.

    edit: Zu spät. Andersrum wie cooky kann man es auch machen, wie ich schon erwähnt habe. Dann ist man eben selber verantwortlich, dafür ist der Code etwas kürzer, weil man nur einen Cast braucht.



  • Danke fuer die Antworten. Was ich jedoch nicht verstehe, was Ihr mit 'umgekehrt' meint?! Wieso ist Seppj's Code 'umgekehrt dem von 'Cookie' ?


  • Mod

    wollewausfander schrieb:

    Danke fuer die Antworten. Was ich jedoch nicht verstehe, was Ihr mit 'umgekehrt' meint?! Wieso ist Seppj's Code 'umgekehrt dem von 'Cookie' ?

    int* kompliziert(int* i) { /* kompliziertes Zeug auf i, aber nicht auf *i */ return i;}
    
    const int* kompliziert(const int* i) {/* Wie die non-const-Version aufrufen, um den Code nicht zu wiederholen? So: */ return kompliziert(const_cast<int*>(i));}
    

    Aber dann sollte man lieber sicher sein, dass das auch wirklich richtig ist.



  • Danke Seppj. Jedoch, die Frage war, was zwischen Deinem und Cookie's Code 'umgekehrt' ist. Mir faellt es ausserdem etwas schwer, den code zuzuordnen. Um was handelt es sich genau, um angepassten Code, der von 'falsch programmiertem' externen code aufgerufen wird oder umgekehrt? Wo wird denn wann was aufgerufen, und was war/ist falsch?



  • Kellerautomat schrieb:

    Genau falschrum cooky.

    Andererseits versteh ich das nicht, für sowas gibt es doch mutable .



  • Hacker schrieb:

    Andererseits versteh ich das nicht, für sowas gibt es doch mutable .

    Falsch.


  • Mod

    wollewausfander schrieb:

    Danke Seppj. Jedoch, die Frage war, was zwischen Deinem und Cookie's Code 'umgekehrt' ist. Mir faellt es ausserdem etwas schwer, den code zuzuordnen. Um was handelt es sich genau, um angepassten Code, der von 'falsch programmiertem' externen code aufgerufen wird oder umgekehrt? Wo wird denn wann was aufgerufen, und was war/ist falsch?

    Das war ein Beispiel zu meinem Punkt b, wie man in manchen Fällen Codeduplizierung sparen kann, nicht zum Aufruf von falschem externen Code. Man kann mit dem const_cast sowohl von der const-Variante aus die non-const aufrufen als auch umgekehrt. Das war das "umgekehrt" von dem wir gesprochen haben.



  • SeppJ schrieb:

    Das war ein Beispiel zu meinem Punkt b, wie man in manchen Fällen Codeduplizierung sparen kann, nicht zum Aufruf von falschem externen Code. Man kann mit dem const_cast sowohl von der const-Variante aus die non-const aufrufen als auch umgekehrt. Das war das "umgekehrt" von dem wir gesprochen haben.

    Alles klar, danke!


Anmelden zum Antworten