Получение одного и того же значения переменной const даже после его изменения с помощью const_cast

Рассмотрим приведенный ниже фрагмент кода:

int main()
{
    const int i=3;
    int *ptr;

    ptr=const_cast<int*>(&i);
    *ptr=5;

    cout<<"i= "<<i<<endl;  <------------------- statement 1
    cout<<"*ptr= "<<*ptr<<endl;  <------------- statement 2

    return 0;
}

Я получаю вывод как:

i= 3
*ptr= 5

http://ideone.com/Bvme6

Почему ценностьi не меняется через указатель?

Я знаю, что отбрасывание константности переменной, которая явно объявлена как const, и изменение ее значения - это «неопределенное поведение». Мне любопытно узнать: это какой-нибудь механизм оптимизации компилятора, который "компилятор заменяет переменную в программе значением"? Это означает, что оператор 1 интерпретируется компилятором как:

cout<<"i= "<<3<<endl;

Даже если заявление

ptr=const_cast<int*>(&i);    

заменяется

 ptr=(int*)(&i);

Я получаю тот же вывод:http://ideone.com/5lzJA

 James27 июл. 2012 г., 17:33
Я думаю, что отрицательные голоса являются суровыми
 Flexo♦27 июл. 2012 г., 17:42
Оптимизацию обычно называют «постоянным распространением». Компилятору разрешено делатьanything это нравится, пока наблюдаемое поведение является правильным. Поведение не определено, поэтому компилятор автоматически исправляет все, что он делает.
 R. Martinho Fernandes27 июл. 2012 г., 17:21
Если вы хотите знать, что сделал компилятор, просто посмотрите, что сделал компилятор (то есть сгенерированный код).

Ответы на вопрос(5)

Решение Вопроса

Is it any compiler optimization mechanism that compiler replaces the variable in the program with the value?

Да; вот почему вы не видите изменения стоимости. Поведение пытается изменитьconst объект оставлен неопределенным, чтобы позволить такую оптимизацию (а также позволить помещать объекты в неписываемую память).

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

Скорее всего, поскольку это const int, компилятор оптимизирует и напрямую заменяет его значением i.

У меня та же проблема, я добавил volatile, теперь он изменяет:

#include<iostream>
using namespace std;

int main()
{
  volatile const int a=5;
  int *p = const_cast<int*>(&a);
  *p=6;
  cout<<"a="<<a;
  return 0;
}

Выход:

a=6

volatile сообщает компилятору, что идентификатор может быть изменен (если не этим кодом, то кем-то другим, поэтому не выполняйте никакой оптимизации)

i could храниться в защищенной области памяти дляptr указать на. Конечно, может быть что угодно, вот почемуundefined - это в основном означает, что не зависит от какого-либо конкретного поведения, возникающего, если вы попытаетесь вызвать неопределенное поведение.

Насколько вам известно, это может привести к остановке сердца или к запуску лазерных лучей, но вы никогда не узнаете, потому что это ... (как это ...)undefined ;).

Ваш ответ на вопрос