Странно поведение на 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, е недефинирано поведение, може да се случи буквално всичко.

person user657267    schedule 22.04.2014

Въпреки че const_cast може да премахне константността от всеки указател или препратка, използването на получения указател или препратка за запис в обект, който е деклариран като const, предизвиква недефинирано поведение.

вижте примера тук за повече илюстрация:

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