Если у вас есть
void foo(const int& a)
{
const_cast<int&>(a) = 4;
}
, то
int a = 1;
foo(a);
совершенно законно, но
const int a = 1;
foo(a);
вызывает неопределенное поведение, потому что в foo
,a
изначально был const
.
В некоторых случаях это полезно (обычно при взаимодействии со старой библиотекой C), но в большинстве случаев вы делаете что-то не так и должны переосмыслить свое решение.
И чтобы ответить, почему const_cast<>
не вещь, я бы сказал, по двум причинам.Во-первых, когда вы делаете const_cast
, вы должны действительно знать, что делаете, если какой-то шаблонный вывод был разрешен, это повысило бы вероятность возникновения непреднамеренных ошибок.И, во-вторых, const_cast
также можно использовать для удаления volatile
, и как компилятор может узнать, что вы хотите отбросить?