Что произошло при увеличении константного указателя верхнего уровня?

Когда я пытался выяснить const и const_cast верхнего уровня, я написал некоторый код следующим образом.

int main()
{
    // m is a top-level const
    const int m = 10;

    // this is an undefined behavior according to *Primer c++*
    // but I still compile and run this without warning. 
    int *q = const_cast<int *>(&m);
    (*q)++;

    //Then I print the address and the value
    cout<< "the value  of address "<< q <<" is "<< *q <<endl;
    cout<< "the value  of address "<< &m <<" is "<< m <<endl;
    return 0;
}

Результат печати меня смущает.

the value  of address 0x7ffee6a43ad8 is 11
the value  of address 0x7ffee6a43ad8 is 10

Это одно из неопределенного поведения? Что на самом деле произошло, когда я делаю "(*q)++"?

заранее спасибо

2 ответа

Обратите внимание, что ваш код не работает *q++, оно делает (*q)++,

С *q++ Вы увеличиваете указатель. С (*q)++ Вы увеличиваете то, на что оно указывает.

Это все хорошо, за исключением того, что q указывает на постоянное значение. Попытка изменить постоянное значение, действительно, является неопределенным поведением.

Если вы вместо этого сделали *q++ и увеличил указатель, тогда вы не изменили бы значение константы, так что все будет в порядке. С другой стороны, он больше не указывает на действительный объект, и вместо этого у вас будет UB при разыменовании q при печати значения оно указывает на.

Это одно из неопределенных поведений?

Да. У вас действительно есть две строки, каждая из которых может вызвать неопределенное поведение.

int *q = const_cast<int *>(&m);

а также

(*q)++;

В первом вы используете const_cast удалить const-ность объекта, на который указывает указатель, когда этот объект был создан с const Классификатор.

Во втором вы изменяете значение const объект.

Что на самом деле произошло, когда я сделал "(*q++)"?

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

Другие вопросы по тегам