Esse código subverte o sistema do tipo C ++?

Eu entendo que ter umconst método em C ++ significa que um objeto é somente leitura através desse método, mas que ainda pode mudar de outra forma.

No entanto, este código aparentemente muda um objeto através de umconst referência (ou seja, através deconst método).

Este código é legal em C ++?

Em caso afirmativo: está quebrando oconst-ness do sistema de tipos? Porque porque não?

Se não: por que não?

Nota 1: Eu editei o exemplo um pouco, então as respostas podem estar se referindo a exemplos mais antigos.Edit 2: Aparentemente você nem precisa do C ++ 11, então eu removi essa dependência.
#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;
}
Atualizar:

Eu migrei o lambda para a lista de inicialização do construtor, pois isso permite que eu diga posteriormenteconst BreakConst bc;que - porquebc em si&nbsp;é agora const (em vez de meramente o ponteiro) - parece implicar (por Stroustrup) que modificarbc&nbsp;de qualquer forma após a construção deve resultar em um comportamento indefinido, mesmo que o construtor e o chamador não tenham como saber isso sem ver as definições dos outros.