¿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.