"Permitido" es lo opuesto a "prevenido", pero también es lo opuesto a "prohibido". Has visto que no se previene la modificación de tu objeto const, pero eso no significa exactamente que esté permitido.
La modificación de un objeto const no está "permitida" en el sentido de ser "permitida". El comportamiento de su programa no está definido por el estándar (consulte 6.7.3/5). Sucede que en su implementación, en esa ejecución, vio el valor 3. En otra implementación o en otro día, es posible que vea un resultado diferente.
Sin embargo, no está "prevenido", porque con la forma en que C funciona, detectarlo en tiempo de compilación es un problema de detención. Detectarlo en tiempo de ejecución requiere controles adicionales en todos los accesos a la memoria. El estándar está diseñado para no imponer una gran sobrecarga en las implementaciones.
La razón por la que se rechaza const es compatible, es porque si tiene un puntero const para un objeto no const, el lenguaje le permite (en ambos sentidos) modificar ese objeto. Para hacerlo, debes deshacerte del calificador const. La consecuencia de esto es que los programadores también pueden descartar calificadores const desde punteros a objetos que en realidad son const.
Aquí hay un ejemplo (un poco tonto) de código que descarta un calificador const por esa razón:
typedef struct {
const char *stringdata;
int refcount;
} atom;
// returns const, because clients aren't allowed to directly modify atoms,
// just read them
const atom *getAtom(const char *s) {
atom *a = lookup_in_global_collection_of_atoms(s);
if (a == 0) {
// error-handling omitted
atom *a = malloc(sizeof(atom));
a->stringdata = strdup(s);
a->refcount = 1;
insert_in_global_collection_of_atoms(a);
} else {
a->refcount++;
}
return a;
}
// takes const, because that's what the client has
void derefAtom(const atom *a) {
atom *tmp = (atom*)a;
--(tmp->refcount);
if (tmp->refcount == 0) {
remove_from_global_collection_of_atoms(a);
free(atom->stringdata);
free(atom);
}
}
void refAtom(const atom *a) {
++(((atom*) a)->refcount);
}
Es una tontería, porque un diseño mejor sería remitir-declarar atom
, para hacer punteros a ella completamente opaco y proporciona una función para acceder a los datos de cadena. Pero C no requiere que encapsule todo, le permite devolver punteros a tipos completamente definidos, y quiere admitir este tipo de uso constante para presentar una vista de solo lectura de un objeto que es "realmente" modificable.
Porque C es la encarnación perfecta del tipado débil. "Los tipos son solo por diversión, si no te gusta el tipo de cosas, solo escríbelo";) – delnan
Ley de Osborn http://www.anvari.org/fortune/Fortune_Cookies/95_osborn-s-law-variables-won- t.html – Jaydee
Porque C & C++ te permitirá hacer lo que quieras, incluso si quieres hacer algo realmente, realmente estúpido. –