Подрывает ли этот код систему типов C ++?

Я понимаю, что имеяconst Метод в C ++ означает, что объект доступен только для чтения через этот метод, но в противном случае он может измениться.

Тем не менее, этот код, по-видимому, изменяет объект черезconst ссылка (т.е. черезconst метод).

Является ли этот код законным в C ++?

Если так: это ломаетconst-честь системы типов? Почему, почему нет?

Если нет: почему бы и нет?

Note 1: I have edited the example a bit, so answers might be referring to older examples. Edit 2: Apparently you don't even need C++11, so I removed that dependency.
#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;
}
Update:

Я перенес лямбду в список инициализации конструктора, поскольку это позволяет мне впоследствии сказатьconst BreakConst bc;который - потому чтоbc itself теперь const (а не просто указатель) - может показаться (Страуструп) что модифицируетbc в любом случае после построения должно получиться неопределенное поведение, даже если конструктор и вызывающая сторона не смогут узнать об этом, не увидев друг друга & apos; определения.

Ответы на вопрос(5)

Ваш ответ на вопрос