[Gelöst] Nicht-Konstante Referenz erzwingen



  • Guten Tag,

    ich habe ein Klassentemplate A mit folgender Definition:

    template <typename T,size_t D>
    class A
    {
        std::array<T,D> foo_;
    
        public:
            /* ... *tors, etc ... */
    
            T& operator[](size_t pos);
    };
    

    Das Problem, das ich habe, liegt in der Definition der Methode T& A::operator[]() . Mache ich dort ein simples

    return foo_[pos];
    

    , so erhalte ich (mit GCC 4.7) eine konstante Referenz und kann auf das Element zwar lesend zugreifen, aber nicht schreiben, es wird also scheinbar auf const_reference std::array::operator[]( size_t pos ) const zugegriffen und nicht auf reference std::array::operator[]( size_t pos )

    Wie sorge ich dafür, dass ich in diesem Fall einen operator[] mit Schreibzugriff bekomme?

    Mit freundlichen Grüßen,
    Ki





  • cooky451 schrieb:

    Hm.. http://ideone.com/TzN65X

    Tut mir Leid, genau das Gegenteil war das Problem. 😃
    Ich hatte einen konstantes A und noch keinen operator[] für konstante Referenzen definiert und darum wollte er nicht.

    Dennoch danke.



  • Ki schrieb:

    Nicht-Konstante Referenz

    Sowas existiert nicht. Referenzen sind immer konstant.

    Was du meinst, ist eine Referenz auf ein nicht-konstantes Objekt (oder kurz non-const reference).



  • Hallo Nexus,

    und jetzt übersetze mal non-const reference ins deutsche 😉



  • Th69 schrieb:

    Hallo Nexus,

    und jetzt übersetze mal non-const reference ins deutsche 😉

    Wenn man es auf deutsch übersetzt (nicht-konstante Referenz), dann lesen es auch alle so, wie man deutsche Sprache eben liest, von links nach rechts. Und das ist eben falsch. Es heißt eben nicht nicht-konstante Referenz, sondern Referenz auf ein nicht-konstantes Objekt. Von rechts nach links lesen. Das ist eben der eine Grund warum man non-const reference sagt (um aufs richtige Lesen hinzuweisen). Der andere Grund ist einfach, dass der C++-Standard diese Schreibweise verwendet.



  • out schrieb:

    Wenn man es auf deutsch übersetzt (nicht-konstante Referenz)

    Es heisst wortwörtlich übersetzt eben nicht "nicht-konstante Referenz", sondern "Nichtkonstanten-Referenz". Die Nichtkonstante ist das nicht-konstante Objekt.



  • Th69 schrieb:

    und jetzt übersetze mal non-const reference ins deutsche 😉

    Es heisst "const" und nicht "constant". Wichtiger Unterschied.

    Deutsch wäre es also Non-Const-Referenz.

    Interessanterweise haben damit sehr viele Leute Probleme, aber bei const_iterator ist plötzlich allen klar, dass sich das "const" nicht auf den Iterator, sondern das referenzierte Element bezieht. Bei den Member-Typen const_pointer und const_reference ist das nicht anders.


Anmelden zum Antworten