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.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage