¿Este código subvierte el sistema de tipo C ++?

Entiendo que tener unconst El método en C ++ significa que un objeto es de solo lectura a través de ese método, pero que todavía puede cambiar de otra manera.

Sin embargo, este código aparentemente cambia un objeto a través de unconst referencia (es decir, a través de unaconst método).

¿Es este código legal en C ++?

Si es así: ¿Está rompiendo elconst¿-ness del sistema de tipos? ¿Por qué por qué no?

¿Si no, porque no?

Nota 1: He editado el ejemplo un poco, por lo que las respuestas pueden estar refiriéndose a ejemplos anteriores.Edición 2: al parecer, ni siquiera necesitas C ++ 11, así que eliminé esa dependencia.
#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;
}
Actualizar:

He migrado la lambda a la lista de inicialización del constructor, ya que al hacerlo me permite decir posteriormenteconst BreakConst bc;, que - porquebc sí mismo ahora es const (en lugar de simplemente el puntero) - parece implicar (por Stroustrup) que modificandobc En cualquier caso, después de la construcción, se debe producir un comportamiento indefinido, aunque el constructor y la persona que llama no tengan forma de saber esto sin ver las definiciones de los demás.

Respuestas a la pregunta(5)

Su respuesta a la pregunta