Это неопределенное поведение с const_cast?

Что здесь происходит?

const int a = 0;
const int *pa = &a;

int *p = const_cast<int*>(pa);
*p = 1;  // undefined behavior ??
cout << a << *p;  // ??

Мой компилятор выводит 0 и 1, но адрес «a» и значение «p» совпадают, поэтому я не понимаю, как это возможно.


person Tracer    schedule 08.08.2014    source источник


Ответы (3)


Цитата из cppreference:

Несмотря на то, что const_cast может удалить константность или изменчивость из любого указателя или ссылки, использование результирующего указателя или ссылки для записи в объект, объявленный константным, или для доступа к объекту, объявленному изменчивым, приводит к неопределенному поведению.

Так что да, изменение постоянных переменных — это поведение undefined. Вывод, который вы видите, вызван тем фактом, что вы сообщаете компилятору, что значение a никогда не изменится, поэтому он может просто поместить литерал 0 вместо переменной a в строке cout.

person Baum mit Augen    schedule 08.08.2014

§7.1.6.1 [dcl.type.cv]/p4:

За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить объект const во время его существования (3.8) приводит к неопределенному поведению.

person T.C.    schedule 08.08.2014

Попытка записать константное значение является поведением undefined, например, чтобы позволить компилятору выделить значения const в память только для чтения (обычно в сегменте кода) или встроить их значение в выражения во время компиляции, что и происходит в вашем случае.

person pqnet    schedule 08.08.2014