legittima uso (secondo me) è con gli iteratori std::set
. Sono sempre const
, per evitare di cambiare la chiave utilizzata nel set. La modifica della chiave interromperebbe la struttura interna dell'insieme e causerebbe un comportamento indefinito.
Tuttavia, finché la chiave non cambia, è possibile modificare altri dati nell'oggetto.
Diciamo che avete un std::set
come questo:
std::set<MyObject> some_set;
E una classe come questa:
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_;
};
Nell'esempio precedente, il tasto è già const, quindi, anche se modificare l'oggetto, non è possibile rompere la struttura interna del set.
Normalmente si può ottenere solo un riferimento const
da un iteratore set:
const MyObject &object = *some_set_iterator;
Ma dal momento che la chiave è const
, è sicuro di const_cast
l'iteratore Dereferenced:
MyObject &object = const_cast<MyObject &>(*some_set_iterator);
Ho appena imparato qualcosa di fantastico! Grazie mille ! – ereOn
anch'io, +1, grazie! – Sanish