Почему 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). -конец примечания ]

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