Мне интересно ваше дело ... Все ниже, кроме предположения, потому что вы не предоставили пример кода, описывающего вашу проблему, так что ...
Причина
Я думаю,у вас есть что-то вроде:
struct MyValue
{
int i ;
const int k ;
} ;
IIRC, оператор присваивания по умолчанию будет выполнять присваивание по элементам, что сродни:
MyValue & operator = (const MyValue & rhs)
{
this->i = rhs.i ;
this->k = rhs.k ; // THIS WON'T WORK BECAUSE K IS CONST
return *this ;
} ;
Таким образом, это не будетгенерируется.
Итак, ваша проблема в том, что без этого оператора присваивания контейнеры STL не примут ваш объект.
Насколько я вижу:
- Компилятор вправе не генерировать это
operator =
- Вы должны предоставить свой собственный, потому что только вы точно знаете, что вы хотите
Ваше решение
Я боюсь понять, что вы подразумеваете под const_cast
.
Моим собственным решением вашей проблемы было бы написать следующий пользовательский оператор:
MyValue & operator = (const MyValue & rhs)
{
this->i = rhs.i ;
// DON'T COPY K. K IS CONST, SO IT SHOULD NO BE MODIFIED.
return *this ;
} ;
Таким образом, еслиу вас будет:
MyValue a = { 1, 2 }, b = {10, 20} ;
a = b ; // a is now { 10, 2 }
Насколько я понимаю, это логично.Но я думаю, читая решение const_cast
, вы хотите иметь что-то более похожее на:
MyValue a = { 1, 2 }, b = {10, 20} ;
a = b ; // a is now { 10, 20 } : K WAS COPIED
Что означает следующий код для operator =
:
MyValue & operator = (const MyValue & rhs)
{
this->i = rhs.i ;
const_cast<int &>(this->k) = rhs.k ;
return *this ;
} ;
Но,затем вы написали в своем вопросе:
Я хотел бы сделать все, что не изменится в течение времени жизни объектов const
С тем, что я предположил, является вашим собственным const_cast
решение, k изменилось в течение времени жизни объекта, что означает, что вы противоречите себе, потому что вам нужна переменная-член, которая не изменяется в течение времени жизни объекта , если вы не хотите, чтобы она изменилась !
Решение
Примите тот факт, что ваша переменная-член изменится в течение времени существования объекта-владельца, и удалите const.