std::vector aus Referenzen?


  • Mod

    Referenzen sind keine Objekte.



  • Braucht eine Referenz nicht wie ein Pointer speicher? Oder laut welchem Kriterium ist eine Referenz kein Objekt?

    Sorry, das interessiert mich jetzt.

    greetz, Swordfish



  • Standard 8.3.2 3

    It is unspecified whether or not a reference requires storage (3.7).

    und in 4 stehen auch noch weitere nette Dinge wie z.Bsp.

    There shall be no references to references, no arrays of references, and no pointers to references. ...


  • Mod

    Swordfish schrieb:

    Braucht eine Referenz nicht wie ein Pointer speicher? Oder laut welchem Kriterium ist eine Referenz kein Objekt?

    Sorry, das interessiert mich jetzt.

    greetz, Swordfish

    Da ist zunächst Abschnitt 1.8 : An object is a region of storage.
    Dann 3.7 (Storage Duration), hier wird schon aus der Gliederung deutlich, dass mit Objekten keine Referenzen gemeint sind, deshalb bekommen diese einen eigenen Absatz.
    oder z.B. 3.9 Types describe objects (1.8), references (8.3.2), or functions (8.3.5).
    oder 5.3.4 [Note: because references are not objects, references cannot be created by new-expressions.
    u.s.w.
    irgendwo wird auch gesagt, dass es unspezifiziert ist, ob Referenzen Speicher benötigen oder nicht. Aber auch Referenzen, die Speicher benötigen, sind keine Objekte.



  • Weiter zeigt eine Referenz immer (...) auf ein gültiges Objekt
    Deshalb muss man ihnen auch gleich bei der Deklaration einen gültigen Wert zuweisen.
    Und das ist bei new, resize() etc. nicht möglich.


  • Mod

    wandrer schrieb:

    Weiter zeigt eine Referenz immer (...) auf ein gültiges Objekt
    Deshalb muss man ihnen auch gleich bei der Deklaration einen gültigen Wert zuweisen.
    Und das ist bei new, resize() etc. nicht möglich.

    Wobei nicht so ganz klar, was gültig in diesem Zusammenhang sein soll. Zumindest verweisen sie stets auf Speicher, der geeignet ist, ein Objekt vom jeweiligen Typ aufzunehmen. Beispiel

    T x;
    T& y = x;
    T* z = &x;
    x.~T();
    cout << sizeof y << reinterpret_cast<char&>(y);
    new (z) T();
    

    Hier ist nichts undefiniertes, aber zwischendurch verweist die Referenz nicht auf ein gültiges Objekt. Das aber nur als Anmerkung - prinzipiell hat wandrer recht.



  • Besten dank für die vielseitige Aufklärung. Weis man schon, ob sich dahingehend in C++ 2009 was ändern wird?



  • Warum soll sich was zu C++2009 dies bzgl. was ändern?



  • Naja, vielleicht kommt man ja auf die Idee, das auch eine Referenz speicher braucht 😉

    Besten Dank nochmal.

    greetz, Swordfish


  • Mod

    Swordfish schrieb:

    Naja, vielleicht kommt man ja auf die Idee, das auch eine Referenz speicher braucht 😉

    Besten Dank nochmal.

    greetz, Swordfish

    Das ist ja bereits möglich und dem Compiler freigestellt. Aber warum es ihm vorschreiben:

    const Foo& x = Foo();
    

    Wozu hier noch extra Platz für die Referenz verschwenden (den Platz für das Temporary brauchen wir so oder so), was dann zudem Optimierungsmöglichkeiten einschränkt?



  • Swordfish schrieb:

    Naja, vielleicht kommt man ja auf die Idee, das auch eine Referenz speicher braucht 😉

    Dann benutze Pointer.


Anmelden zum Antworten