Probleme mit Referenz auf Zeiger...



  • Hallo...

    Ich habe wohl ein Verständnisproblem.
    Warum ist Folgendes nicht möglich?

    unsigned char bytes[] = { 2, 5, 9 };
    unsigned char* pBytes = bytes;
    
    // cannot convert from 'unsigned char *' to 'const unsigned char *&'
    const unsigned char*& bytesRef = pBytes;
    

    Ich möchte eine Referenz auf einen Zeiger auf konstante unsigned characters.
    Lasse ich das const weg oder mache den Zeiger selbst auch konstant, gibt es keine Probleme.

    Aber das sollte doch eigentlich hinhauen?
    Danke für jegliche Erklärung!



  • const unsigned char& bytesRef = *pBytes;
    

    Das sollte gehen.. grade keinen Compiler zur Hand.
    rya.



  • Ja, geht, aber...

    Komischer schrieb:

    Ich möchte eine Referenz auf einen Zeiger auf konstante unsigned characters.

    Es soll keine Variable erstellt werden, es soll nix dereferenziert werden, einfach eine Referenz auf eine vorhandene Zeigervariable. Dabei sollen aber die Daten nicht veränderbar sein. Warum muss dann der Zeiger auch konstant sein?


  • Mod

    Komischer schrieb:

    Aber das sollte doch eigentlich hinhauen?

    Nein, denn du könntest die Referenz benutzen, um einen Zeiger, der auf nicht-modifizierbare Daten zeigt, zuzuweisen. Anschließend benutzt du pBytes, um die Daten doch zu modifizieren, alles ohne Cast - es würde also ein Loch im Typsystem entstehen.

    unsigned char bytes[] = { 2, 5, 9 };
    unsigned char* pBytes = bytes;
    
    const unsigned char*& bytesRef = pBytes; // wir nehmen an das geht.
    const char foo[] = "foo";
    bytesRef = foo; // ok
    pBytes[0] = 42; // ups, modifiziert das konstante Array
    

    Das Loch ist nicht da, wenn die Referenz selbst auf eine konstanten Zeiger verweist, dann wäre nämlich die Zuweisung

    bytesRef = foo;
    

    unmöglich.



  • Aber "pBytes[0] = 42;" wäre doch garnicht möglich, weil es ja eine Referenz auf einen Zeiger auf konstante Daten ist...

    😕



  • Ohh, da stand pBytes, nicht bytesRef, sorry!
    Jetzt verstehe ich, danke!


Anmelden zum Antworten