Frage zum Speichern & Laden von Datein



  • LOL, wer hat den bitte sowas erfunden ?!, das ist doch total sinnlos 😮

    Wenn ich const haben will, dann will ich auch const haben 💡

    Aber ok 'leuchtet ein'^^...

    PS: Einer meiner Compiler meckert auch bei deiner ersten Funktion (MVC++ 6.0)



  • CodeFinder schrieb:

    LOL, wer hat den bitte sowas erfunden ?!, das ist doch total sinnlos 😮

    Wenn ich const haben will, dann will ich auch const haben 💡

    Nö, macht doch nur, was man ihm sagt

    const char *constant;
    char *not_constant = ( char* ) constant;
    

    er wandelt "const char*" nach "char*". Der eigentliche Pferdefuß ist der, daß sowas in C mal eben so aus versehen passiert. In C++ ist es wegen des const_cast< > operators nicht mehr möglich, sich "aus versehen" in's Knie zu schießen. Dazu braucht's dann halt 'ne gehörige Portion Absicht. 😃

    CodeFinder schrieb:

    [...] Einer meiner Compiler meckert auch bei deiner ersten Funktion (MVC++ 6.0)

    Das ist auch gut so! Aber denkst du nicht, du solltest ihn dann mal "in Frieden ruhen" lassen!?

    Greetz, Swordfish


  • Mod

    obwohl die beschränkung, dass von den template-style casts nur const_cast in der lage ist, const-qualifikation wegzucasten, wichtig ist, so ist doch ein C-style cast noch in anderer hinsicht etwas ganz anderes als ein static_cast.
    als faustregel gilt, dass mit static_cast alle die konvertierungen möglich sind, die auch implizit erlaubt sind, sowie deren umkehrungen (mit ausnahme des wegcastens von const)
    ein C-style cast hat, in derselben situation angewandt, denselben effekt. er erlaubt allerdings noch weitere konvertierungen: solche, die ein static_cast mit einem const_cast kombinieren. und solche, die sonst nur mittels reinterpret_cast (ggf. ergänzt mit const_cast) möglich sind. das bedeutet, dass ein bestimmter ausdruck, der einen c-style cast enthält, möglicherweise kontextabhängige bedeutung hat (was eigentlich immer schlecht ist). beispiel:

    struct A;
    struct B;
    B* foo(A* p) { return (B*)p; } // reinterpret_cast<B*>(p);
    struct A {};
    struct B: A {};
    B* foo(A* p) { return (B*)p; } // static_cast<B*>(p);
    

    das schlimme daran ist, dass ein compiler hier nicht einmal warnt, wenn der cast al s reinterpret_cast interpretiert wird.



  • Swordfish schrieb:

    Nö, macht doch nur, was man ihm sagt

    Ja, klar macht er, was man ihm sagt...aber findest du die Idee eines const-Casts sinnvoll (mal davon abgesehen der ein const-Cast in C++ offentlichtlicher ist) ? - Hast du den jemals verwendet ? ➡ ⚠
    Also irg.-wie strebt der gegen meine Logik 😃 🤡

    Swordfish schrieb:

    Das ist auch gut so! Aber denkst du nicht, du solltest ihn dann mal "in Frieden ruhen" lassen!?

    Greetz, Swordfish

    Jo auf jeden Fall 😉 naja der Comp. is sowieso voller Bugs... 👎

    PS: Danke nochmal für das erläuternde Beispiel bzgl. C/C++ und const-Casts 👍



  • CodeFinder schrieb:

    Ja, klar macht er, was man ihm sagt...aber findest du die Idee eines const-Casts sinnvoll (mal davon abgesehen der ein const-Cast in C++ offentlichtlicher ist) ? - Hast du den jemals verwendet ? ➡ ⚠
    Also irg.-wie strebt der gegen meine Logik 😃 🤡

    Ja, ist praktisch, wenn man an Code von anderen darf, die keine Ahnung von const correctness haben.



  • Michael E. schrieb:

    CodeFinder schrieb:

    Ja, klar macht er, was man ihm sagt...aber findest du die Idee eines const-Casts sinnvoll (mal davon abgesehen der ein const-Cast in C++ offentlichtlicher ist) ? - Hast du den jemals verwendet ? ➡ ⚠
    Also irg.-wie strebt der gegen meine Logik 😃 🤡

    Ja, ist praktisch, wenn man an Code von anderen darf, die keine Ahnung von const correctness haben.

    Bezug ? ⚠



  • Beispiel:

    // foo.h (gehört zu ner Lib)
    
    void print(Bar &b)
    {
        cout << b;
    }
    
    // end of foo.h
    
    // baz.cpp
    
    #include "foo.h"
    #include "bar.h"
    
    const Bar bar(42);
    
    print(bar);    // error, shit!
    print(const_cast<Bar>(bar));    // klappt :)
    

    Die Funktion print() aus ner externen Lib übernimmt kein konstantes Bar-Objekt, obwohl sie es nicht verändert. Wenn ich jetzt wie in baz.cpp ein konstantes Objekt hab, meldet mir der Compiler beim Aufruf von print(bar) einen Fehler.


Anmelden zum Antworten