У вас есть такой случай:
struct sample {
int const a; // const!
sample(int a):a(a) { }
};
Теперь вы используете это в некотором контексте, который требует присваивания sample
- возможно в контейнере (например, карта, вектор или что-то еще). Это не удастся, потому что неявно определенный оператор присваивания копии делает что-то вроде этой строки:
// pseudo code, for illustration
a = other.a;
Но a
является постоянным! Вы должны сделать это неконстантным. Это не больно, потому что до тех пор, пока вы его не измените, оно по-прежнему логически константно :) Вы можете решить проблему, введя подходящий operator=
, сделав так, чтобы компилятор не определял его неявно. Но это плохо, потому что вы не сможете изменить свой постоянный член. Таким образом, имея оператор =, но все же нельзя назначить! (потому что копия и присвоенное значение не идентичны!):
struct sample {
int const a; // const!
sample(int a):a(a) { }
// bad!
sample & operator=(sample const&) { }
};
Однако в вашем случае очевидная проблема, по-видимому, лежит в пределах std::pair<A, B>
. Помните, что std::map
сортируется по ключам, которые он содержит. Из-за этого вы не можете изменить его ключи, потому что это может легко сделать состояние карты недействительным. Из-за этого справедливо следующее:
typedef std::map<A, B> map;
map::value_type <=> std::pair<A const, B>
То есть запрещает изменять содержащиеся в нем ключи! Так что если вы делаете
*mymap.begin() = make_pair(anotherKey, anotherValue);
Карта выдает ошибку, потому что в паре некоторого значения, хранящегося на карте, элемент ::first
имеет тип с постоянным типом!