Одно допустимое использование (на мой взгляд) с std::set
итераторами. Они всегда const
, чтобы предотвратить изменение ключа, используемого в наборе. Изменение ключа нарушит внутреннюю структуру набора и приведет к неопределенному поведению.
Однако, пока ключ не изменяется, безопасно изменять другие данные в объекте.
Допустим, у вас есть std::set
как это:
std::set<MyObject> some_set;
И такой класс:
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_;
};
В приведенном выше примере ключ уже равен , поэтому даже если вы измените объект, вы не сможете нарушить внутреннюю структуру набора.
Обычно вы можете получить const
ссылку только из итератора набора:
const MyObject &object = *some_set_iterator;
Но так как ключ const
, безопасно const_cast
разыменованный итератор:
MyObject &object = const_cast<MyObject &>(*some_set_iterator);