reference to reference, pointer to reference illegal?



  • Hallo zusammen.

    Ja, der Titel sagt eigentlich schon alles. Im C++-Primer las ich gerade dass Referenzen auf Referenzen sowie Zeiger auf Referenzen nicht erlaubt sind, da Referenzen keine Objekte sind.

    Nur lässt sich folgender Code aber problemlos und ohne Warnungen kompilieren:

    g++ 4.6.3

    g++ -std=c++0x -Wall -o test test.cpp
    
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
        int i = 9;
    
        int &ri = i;
        int &r2i = ri; // ?!
    
        int *pi = &ri; // ?!
    
        r2i = 13;
        cout << i << endl; // 13
    
        *pi = 27;
        cout << i << endl; // 27
    
        return 0;
    }
    

    C++-Primer, 5th edition:

    Because references are not objects, we may not define a reference to a reference.

    Because references are not objects, they don’t have
    addresses. Hence, we may not define a pointer to a reference.

    Wahrscheinlich hab' ich was im englischen Text missverstanden. Danke für eure Hilfe. 🙂

    MfG Tobi.



  • Tobi. schrieb:

    Nur lässt sich folgender Code aber problemlos und ohne Warnungen kompilieren:

    int main ()
    {
        int i = 9;
    
        int &ri = i;
        int &r2i = ri; // ?!
    
        int *pi = &ri; // ?!
    }
    

    Ich sehe da keine Referenzen auf Referenzen und auch keine Zeiger auf Referenzen. Wie gesagt, eine Referenz ist kein Objekt. Es ist nur ein weiterer Name. Die Ausdrücke i und ri unterscheiden sich weder im Typ noch in der Wert-Kategorie. Beides sind Lvalue-Ausdrücke des Typs int und beide beziehen sich auf ein und dasselbe int-Objekt. pi ist ein Zeiger-auf-int, welcher die Adresse von i bzw ri speichert, also die Adresse des Objekts, auf das sich r und ri beziehen.

    Mit Referenzen auf Referenzen bzw Zeiger auf Referenzen ist so etwas gemeint:

    extern int & & gibtsnicht;
    extern int & * gibtsauchnicht;
    

    Wobei allerdings ab C++11, wenn sich eine Referenz hinter einem Typparameter oder Typedef versteckt, so etwas schreiben darf:

    typedef int& intref;
    typedef intref& auch_eine_intref;
    

    intref und auch_eine_intref sind hier beides Aliase für int& . Das ist einfach praktisch so und nennt sich "reference collapsing".



  • C++-Primer hat es richtig erklärt. Eine Referenz auf eine Referenz oder ein Pointer auf eine Referenz ist nicht möglich.

    Eine Referenz ist die Adresse zum Speicherbereich eines Wertes.
    Ein Pointer ist ein Datentyp, welcher als Wert eine Adresse speichert.
    Was soll die Adresse einer Adresse sein? Gibt's nicht.



  • Hi,
    also "we may not" lese ich hier als "wir können nicht". Wieso können wir nicht? Weil eine Referenz kein Objekt, ist eine Referenz ist nur ein Aliasname, ein Spitzname, für ein Objekt:

    int main ()
    {
        int i = 9;
    
        int &ri = i;
        int &r2i = ri; // ri ist ein Aliasname für i. Du machst also keine Referenz auf eine Referenz, sondern eine Referenz auf i... Eben genau dasselbe, wie in der Zeile drüber.
    
        int *pi = &ri; // Das ist auch kein Zeiger auf eine Referenz... ri ist ja i... also ist &ri ist die Adresse von i. Also machst du einen Zeiger auf i.
    }
    


  • Ich denk' ich hab es jetzt verstanden. Die theoretische schreibweise hat mir deutlich gemacht was der Text sagen will.


Log in to reply