const von String Literalen [ seltsamer Standard ]



  • Hi,

    wieso funktioniert folgendes und kein Compiler der Welt meckert :

    char *string = "Hallo";
    

    "Hallo" ist ein Stringliteral, folgedessen vom Typ const char*. Doch wie kann ich einem nichtkonstanten char Zeiger einen Konstanten zuweisen.
    Zudem ist laut Standard das modifizieren von Stringliteralen undefiniert, was ich aber hier ungehindert machen kann.

    Das tolle ist, das folgender Code "eigentlich" äquivalent zu dem Oberen ist und das richtige Verhalten aufweist:

    const char *temp = "Hallo";
    char *string = temp;           // Error, all ok
    

    Hat der Standard hier was vermurckst oder übersehe ich etwas?



  • Stellt sich mir aber die Frage, warum das hier auch geht:

    int i = 0;
    

    0 ist auch konstant. trotzdem muß i nicht konstant sein. Wird wohl das gleiche sein. Sonst könnte man ja nie im Sourcecode Werte zuweisen.



  • @Ureg:
    Im ersten Fall wird ein konstanter Zeiger in eine nicht-konstante Variable kopiert, im zweiten Fall wird ein konstantes Integral in eine nicht-konstante Variable kopiert. Ist also vom direkten Typ her das gleiche.

    Das hat allerdings nichts mit der Frage zu tun, denn dort ging es um das, was in der ersten Indirektion passiert, denn dort wird ein konstanter Zeiger auf konstante Daten in eine nicht-konstante Variable vom Typ "Zeiger auf nicht-konstante Daten" kopiert.



  • Auch wenn 0 da konstant ist, wird der Wert 0 in i kopiert und ist somit dann modifizierbar.

    Schließlich ist das auch vollkommen legal:

    const int a = 4;
    int b = a;
    

    Hmmm, dann würde aber immer ganz schön viel kopiert werden, aber der Compiler optimiert das vermutlich weg.
    So ganz gefällt mir diese Theorie aber auch nicht und je mehr ich darüber nachdenke, umso konfuser wirds 😕

    Vielleicht meldet sich ja std::camper gleich zu Wort 🙂



  • KasF schrieb:

    Vielleicht meldet sich ja std::camper gleich zu Wort 🙂

    Hat er schon:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1499275.html#1499275
    🙂

    EDIT:
    Auf der ersten Seite des Threads steht noch was von "deprecated compatibility feature".



  • LordJaxom schrieb:

    KasF schrieb:

    Vielleicht meldet sich ja std::camper gleich zu Wort 🙂

    Hat er schon:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1499275.html#1499275
    🙂

    EDIT:
    Auf der ersten Seite des Threads steht noch was von "deprecated compatibility feature".

    Danke für den Link. Also ist dies einfach so um die Kompatibilität zu C zu wahren.
    Das würde aber doch heißen, dass dies in C funktioniert und legal ist und String Literale in C nicht vom Typ const char* sind, oder wie ist dies zu verstehen ?

    [ Aber wir benutzen ja ehe alle std::string 😉 ]


  • Mod

    KasF schrieb:

    LordJaxom schrieb:

    KasF schrieb:

    Vielleicht meldet sich ja std::camper gleich zu Wort 🙂

    Hat er schon:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1499275.html#1499275
    🙂

    EDIT:
    Auf der ersten Seite des Threads steht noch was von "deprecated compatibility feature".

    Danke für den Link. Also ist dies einfach so um die Kompatibilität zu C zu wahren.
    Das würde aber doch heißen, dass dies in C funktioniert und legal ist und String Literale in C nicht vom Typ const char* sind, oder wie ist dies zu verstehen ?

    [ Aber wir benutzen ja ehe alle std::string 😉 ]

    Vor Urzeiten gab es noch const und auch kein const char*. Zeichenkettenkonstanten durften allerdings noch nie modifiziert werden. Man möchte aber gerne, dass uralter PDP-Code weiterhin funktionieren soll (wird er nat. nicht tun, schon des anderen Stils bzgl. Funktionsdeklarationen wegen nicht, aber das kann man, im Gegensatz zu der const Problem, durch automatisierte Tools leicht beheben).



  • Danke 🙂


Anmelden zum Antworten