Una legítimo uso (en mi opinión) es con iteradores std::set
. Siempre son const
, para evitar el cambio de la clave utilizada en el conjunto. Cambiar la clave rompería la estructura interna del conjunto y provocaría un comportamiento indefinido.
Sin embargo, mientras la clave no cambie, es seguro cambiar otros datos en el objeto.
Digamos que usted tiene una std::set
así:
std::set<MyObject> some_set;
Y una clase como esta:
class MyObject {
public:
MyObject(const std::string &key)
: key_(key) {}
bool operator<(const MyObject &other) const {
return key_ < other.key_;
}
private:
// ...
// <some other data>
// ...
const std::string key_;
};
En el ejemplo anterior, la tecla ya está const, por lo que incluso si modificar el objeto, no se puede romper la estructura interna del conjunto.
Normalmente sólo se puede obtener una referencia const
de un iterador de conjunto:
const MyObject &object = *some_set_iterator;
Pero ya que la clave es const
, que es seguro const_cast
el iterador sin referencia:
MyObject &object = const_cast<MyObject &>(*some_set_iterator);
¡Acabo de aprender algo genial! Muchas gracias ! – ereOn
yo también, +1, ¡gracias! – Sanish