Рассмотрим простую программу ниже, которая пытается перебирать значений набора с помощью неконстантная ссылки на элементы в нем:Почему std :: set кажется принудительным для использования const_iterator?
#include <set>
#include <iostream>
class Int
{
public:
Int(int value) : value_(value) {}
int value() const { return value_; }
bool operator<(const Int& other) const { return value_ < other.value(); }
private:
int value_;
};
int
main(int argc, char** argv) {
std::set<Int> ints;
ints.insert(10);
for (Int& i : ints) {
std::cout << i.value() << std::endl;
}
return 0;
}
При компиляции, я получаю сообщение об ошибке с GCC:
test.c: In function ‘int main(int, char**)’:
test.c:18:18: error: invalid initialization of reference of type ‘Int&’ from expression of type ‘const Int’
for (Int& i : ints) {
^
Да, я знаю, что на самом деле я не пытаюсь модифицировать элементы в цикле for. Но дело в том, что я должен иметь возможность использовать неконстантную ссылку для использования внутри цикла, поскольку сам набор не является const. Я получаю ту же ошибку, если создаю функцию setter и использую ее в цикле.
Я объяснил это подробно, здесь: [Ошибка: прохождение ххх, как «это» аргумент ххх выбросе классификаторов] (http://stackoverflow.com/questions/ 5973427/error-through-xxx-as-this-of-xxx-discards-qualifiers) – Nawaz
Если вы действительно хотите изменить элемент 'std :: set', вы можете использовать' const_cast'. Просто убедитесь, что эта модификация не изменяет порядок элемента в наборе, или вы столкнетесь с неопределенным поведением. Это очень небезопасно, поэтому вы должны идти _way_, чтобы сделать это. – gnzlbg