Почему const_cast не изменяет значение в функции вызывающего абонента?
Для приведенного ниже фрагмента,
#include <iostream>
using namespace std;
void fun(const int *p)
{
int *q = const_cast<int *>(p);
*q = *q * 10;
cout<<"q: "<<q<<"\t Value: "<<*q<<endl;
}
int main()
{
const int a = 10;
const int *z = &a;
fun(z);
cout<<"z: "<<z<<"\t"<<"Address of a: "<<&a<<endl;
cout<<"value at z: "<<*z<<"\t\t value in a: "<<a<<endl;
}
произведенная продукция
q: 0x7fff65910fcc Value: 100
z: 0x7fff65910fcc Address of a: 0x7fff65910fcc
value at z: 100 value in a: 10
Почему значение a не изменяется, хотя я пытался изменить его в fun()?
Почему адрес a и указатель z совпадают, но значения разные?
Это некое неопределенное поведение с const_cast?
1 ответ
Это некое неопределенное поведение с const_cast?
Да, ваша программа содержит неопределенное поведение.
Это означает, что вы не можете иметь никаких ожиданий на его выходе. Причина указана в пункте 7.1.6.1/4 стандарта C++11:
За исключением того, что любой член класса объявлен
mutable
(7.1.1) могут быть изменены, любая попытка изменитьconst
объект в течение его жизни (3.8) приводит к неопределенному поведению
Пункт 5.2.11/7 о const_cast
содержит дополнительное предупреждение:
[ Примечание: в зависимости от типа объекта, операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате
const_cast
что отбрасываетconst
-qualifier может привести к неопределенному поведению (7.1.6.1). -конец примечания ]