Что произошло при увеличении константного указателя верхнего уровня?
Когда я пытался выяснить 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++)"?
Вам нужно будет посмотреть на ассемблерный код, чтобы понять, что с ним делает компилятор. Он может делать все, что захочет. Мы не можем винить его за то, что он сделал.