Странное поведение const_cast

Рассмотрим следующий код:

Я объявляю новую ссылку и присваиваю ей значение a через const_cast. Затем я просто увеличиваю эталонное значение, печатаю адреса и значения.

#include <iostream>
using namespace std;
int main()
{
    const int a = 7;
    int &b = const_cast<int&>(a);
    ++b;
    cout<<"Addresses  "<<&a<<" "<<&b<<endl;
    cout<<"Values  "<<a<<" "<<b<<endl;
}

//output
Addresses  0x7fff11f8e30c 0x7fff11f8e30c
Values  7 8

Как я могу иметь 2 разных значения в одном и том же адресе??


person Eduard Rostomyan    schedule 22.04.2014    source источник


Ответы (4)


Изменение константного объекта дает неопределенное поведение, поэтому ваша программа может (в принципе) делать что угодно.

Одна из причин оставить это поведение неопределенным состоит в том, чтобы разрешить оптимизацию замены постоянной переменной ее значением (поскольку вы заявили, что значение никогда не может измениться). Вот что здесь происходит: a заменяется значением 7 во время компиляции, поэтому это значение будет сохранено, что бы вы ни пытались сделать с ним во время выполнения.

person Mike Seymour    schedule 22.04.2014

Поскольку изменение переменной, объявленной как const, является поведением undefined, может произойти буквально все.

person user657267    schedule 22.04.2014

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

посмотрите пример здесь для большей иллюстрации:

http://en.cppreference.com/w/cpp/language/const_cast

person nittoor    schedule 22.04.2014

Любая попытка изменить объект, который сам объявлен как const, с помощью const_cast приводит к неопределенному поведению в соответствии со стандартом ISO C++.

Когда мы ссылаемся на «константный объект», это означает, что память, в которой находится объект, может быть защищена от записи. То есть переменная или выражение типа const может обозначать объект, хранящийся в памяти, защищенной от записи, и любая попытка изменить объект приводит к неопределенному поведению.

РЕДАКТИРОВАТЬ: Обратитесь к этому сайту для получения дополнительной информации

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0571.asc

person DNamto    schedule 22.04.2014