const_cast



  • hi, ist folgender code laut c++ standard gültig?

    #include <iostream>
    using namespace std;
    
    void print (char * str)
    {
      cout << str << endl;
    }
    
    int main () {
      const char * c = "sample text";
      print ( const_cast<char *> (c) );
      return 0;
    }
    


  • Ich seh keinen Grund warum er nicht standardkonform sein sollte.



  • Ich sehe keinen Grund der dagegen spricht sich den beknakkten Cast einfach zu sparen.

    #include <iostream>
    using namespace std;
    
    void print (const char * str)
    {
      cout << str << endl;
    }
    
    int main () {
      const char * c = "sample text";
      print ( c );
      return 0;
    }
    

    grüße



  • der code ist nach standard gültig.
    anders sähe es aus, wenn man versucht hätte, den string zu beschreiben.



  • mondscheinprogger schrieb:

    hi, ist folgender code laut c++ standard gültig?

    #include <iostream>
    using namespace std;
    
    void print (char * str)
    {
      cout << str << endl;
    }
    
    int main () {
      const char * c = "sample text";
      print ( const_cast<char *> (c) );
      return 0;
    }
    

    Ja, aber warum sollte man das tun ?
    Prinzipiell bedeutet die Verwendung von const_cast einen Designfehler ... der in ganz seltenen Fällen unumgänglich/das geringere Übel bedeutet. Das trifft auf Deinen Code aber nicht zu. Außerdem ist ein const_cast eine gefährliche Sache, weil sie schnell zu ganz häßlichen (bisweilen nicht reproduzierbaren) Fehlern/Abstürzen/... führen kann.
    In den allermeisten Fällen kann man durch einen wrapper, der eine temporäre Kopie anlegt, so ein Problem sauber loswerden:

    void print_const (const char * str)
    {
        const size_t s_len = strlen(str);
        char* s = new char[s_len+1];
        strncpy(s, str, s_len);	
        print(s);
        delete[] s;
        // Mögliche Veränderungen von str durch print() werden verworfen
        // Achtung ! Das Teil ist noch nicht ressourcensicher (exceptions, ...)
        // muß man noch machen (try/catch oder scope-Überwacher), ist aber nicht Thema dieses Threads
    }
    
    }
    

    Du kannst dann immer print_const() aufrufen (funktioniert ja auch mit "nicht-const's" (jedenfalls in C++) ) und brauchst Dich um die "const-ness Deines Parameters keinen Kopf mehr zu machen. Schicker ist es natürlich noch mit spezialisierten Funktionstemplates, aber das ist komplizierter und oftmals "unnecessary cleverness" 😉

    volkard schrieb:

    der code ist nach standard gültig.
    anders sähe es aus, wenn man versucht hätte, den string zu beschreiben.

    Naja, wenn er in print in str beschreibt, ist der Code (leider) auch noch gültig, dürfte aber unschönes Verhalten an den Tag legen. 😉

    Gruß,

    Simon2.



  • Dass bei sowas immer gleich zig Leute nach dem Sinn fahnden müssen 🙄

    Ist Euch noch nie eine schlampige C-API untergekommen, die grundsätzlich ohne const arbeitet? Nein? Mir schon (und zwar regelmäßig). Manchmal geht's halt nicht anders 😉

    Prominentes Beispiel: GD

    @Simon2:
    Was ist denn an c_str() bitte weniger const als an const char*? 😉



  • LordJaxom schrieb:

    ...
    Ist Euch noch nie eine schlampige C-API untergekommen, die grundsätzlich ohne const arbeitet? Nein? Mir schon (und zwar regelmäßig).

    Mir auch, aber wenn jemand nach der Syntax von const_cast fragt, hat er vielleicht noch nicht vo den Problemen damit gehört und deshalb halte ich eine "kleine Aufklärung" für durchaus legitim. 😉

    LordJaxom schrieb:

    ...
    Was ist denn an c_str() bitte weniger const als an const char*? 😉

    *Stirnklopf* Hups, hast natürlich Recht. Hatte erst eine char*-Variante geschrieben und kam dann standardmäßig auf "Warum nicht mit String ?" ....
    Naja, ich korrigier's mal - Danke für den Hinweis.

    Gruß,

    Simon2.


Anmelden zum Antworten