const_casting вопрос

У меня есть следующий код:

int main(){
  const int a = 1;
  const int* b(&a);
  int* c = const_cast<int*>(b);
  *c = 29; 
  cout<<*c<<a<<*b;
  return EXIT_SUCCESS;
}

Почему значение «а» не меняется на 29? Означает ли это, что константность a не удаляется при const_casting b?


person badmaash    schedule 23.12.2010    source источник
comment
Кроме того, почему компилятор не жалуется? Я запускаю это на gcc.   -  person badmaash    schedule 23.12.2010
comment
См. этот ответ: stackoverflow.com/questions/357600/ is-const-cast-safe/. В частности, обратите внимание: если исходная переменная на самом деле была константой, то использование const_cast приведет к неопределенному поведению.   -  person Daniel Daranas    schedule 23.12.2010
comment
@Daniel, спасибо за ссылку.   -  person badmaash    schedule 23.12.2010


Ответы (1)


Постоянные переменные также позволяют компилятору выполнять определенные оптимизации, одна из которых заключается в том, что компилятор может сохранить значение в регистрах и не перезагружать его. Это повышает производительность, но не будет работать с переменными, которые изменяются, поскольку их необходимо пересчитывать. Некоторые компиляторы даже оптимизируют константы, не выделяя переменную, а просто заменяя встроенное значение. Если вы измените переменную a на int вместо const int, она будет работать, как это можно прочитать в документации об операторе const_cast от IBM:

Если вы отбросите константность объекта, который был явно объявлен как константа, и попытаетесь изменить его, результаты будут неопределенными.

Дополнительную информацию о проблеме, с которой вы столкнулись, и о том, почему она не работает, можно найти здесь:

В качестве примечания можно отметить, что если вы обнаружите, что вам нужно использовать const_cast, есть большая вероятность, что вместо этого вам следует пересмотреть свой дизайн.

person Tommy Andersen    schedule 23.12.2010