Referenzen und Konstanten: Dynamische Komponenten bei konstanten Objekten (2/2)

Das Problem liegt in der Tatsache begründet, daß das i-te Zeichen des Strings als Referenz zurückgeliefert wird, d.h. es handelt sich um das Original-Zeichen des Strings und kann damit verändert werden.
Der Compiler kann diesen Fehler nicht auffinden, da das Objekt an sich ja gar nicht verändert wird, da die Komponente nur ein Zeiger auf eine Zeichenkette ist. Und dieser Zeiger bleibt konstant, es wird lediglich der Wert, auf den der Zeiger zeigt, verändert!
Man braucht in diesem Fall zwei Implementierungen des Operators [], eine für konstante und eine für variable Strings:

  char& operator[] (unsigned);                // für Variablen
  const char operator [] (unsigned) const;    // für Konstanten

Der entscheidende Unterschied besteht darin, daß nun eine Konstante zurückgeliefert wird, die natürlich nicht verändert werden kann, d.h. nicht nur der Zeiger bleibt konstant, sondern auch der Wert, auf den gezeigt wird.
Der Programmierer sollte sich dieser Probleme bewußt sein und durch Überladen der Operatoren dafür Sorge tragen, daß konstante Objekte auch wirklich konstant bleiben.