Czy ten kod obala system typu C ++?

Rozumiem, że posiadanieconst metoda w C ++ oznacza, że ​​obiekt jest tylko do odczytu przez tę metodę, ale może się jeszcze zmienić w inny sposób.

Jednak ten kod najwyraźniej zmienia obiekt poprzezconst odniesienie (tj. przez aconst metoda).

Czy ten kod jest legalny w C ++?

Jeśli tak: czy to łamieconst-ness systemu typów? Dlaczego? Dlaczego nie?

Jeśli nie: Dlaczego nie?

Uwaga 1: Zmodyfikowałem ten przykład nieco, więc odpowiedzi mogą odnosić się do starszych przykładów.Edytuj 2: Widocznie nawet nie potrzebujesz C ++ 11, więc usunąłem tę zależność.
#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;
}
Aktualizacja:

Zmigrowałem lambdę na listę inicjalizacyjną konstruktora, ponieważ pozwala mi to później powiedziećconst BreakConst bc;, które - ponieważbc samo jest teraz const (zamiast zwykłego wskaźnika) - wydaje się sugerować (przez Stroustrup) to modyfikowaniebc w jakikolwiek sposób po skonstruowaniu powinno doprowadzić do niezdefiniowanego zachowania, nawet jeśli konstruktor i wywołujący nie mieliby sposobu, aby o tym wiedzieć, nie widząc nawzajem definicji.

questionAnswers(5)

yourAnswerToTheQuestion