Unterwandert dieser Code das C ++ - Typsystem?
Ich verstehe das mit einemconst
Methode in C ++ bedeutet, dass ein Objekt über diese Methode schreibgeschützt ist, es sich jedoch möglicherweise noch anders ändert.
Dieser Code ändert jedoch anscheinend ein Objekt durch einconst
Referenz (d. h. durch aconst
Methode).
Ist dieser Code in C ++ legal?
Wenn ja: Bricht es das?const
-Natur des Typsystems? Warum Warum nicht?
Wenn nein, warum nicht?
Hinweis 1: Ich habe das Beispiel ein wenig bearbeitet, daher beziehen sich die Antworten möglicherweise auf ältere Beispiele.Edit 2: Anscheinend brauchst du nicht einmal C ++ 11, also habe ich diese Abhängigkeit entfernt.#include <iostream>
using namespace std;
struct DoBadThings { int *p; void oops() const { ++*p; } };
struct BreakConst
{
int n;
DoBadThings bad;
BreakConst() { n = 0; bad.p = &n; }
void oops() const { bad.oops(); } // can't change itself... or can it?
};
int main()
{
const BreakConst bc;
cout << bc.n << endl; // 0
bc.oops(); // O:)
cout << bc.n << endl; // 1
return 0;
}
Aktualisieren:Ich habe das Lambda in die Initialisierungsliste des Konstruktors migriert, da ich dies später sagen kannconst BreakConst bc;
, welche - weilbc
selbst ist jetzt const (statt nur der Zeiger) - scheint zu implizieren (von Stroustrup) diese Änderungbc
Nach der Konstruktion sollte dies in keiner Weise zu undefiniertem Verhalten führen, auch wenn der Konstruktor und der Aufrufer keine Möglichkeit hätten, dies zu wissen, ohne die Definitionen der anderen zu sehen.