2013-06-25 3 views
-3

Я пробовал выполнить следующую программу.C++ const_cast не удаляет константу переменной

#include<iostream> 
using namespace std; 
int main() 
{ 
const int a = 0; 
cout << &a <<endl; 
int* ptr = const_cast<int*>(&a); 
*ptr = 2; 
cout << ptr <<endl; 
cout << *ptr <<endl; 
cout << a <<endl; 
return 0; 
} 

Выход был:

0xbf92ebd8 
    0xbf92ebd8 
    2 
    0 

Из того, что я знаю, const_cast делает изменяемые, так что он может быть изменен. Изменение отражается, когда я показываю * ptr, но изменение не отражается в a. Может ли кто-нибудь объяснить?

EDIT: Спасибо за все ответы. Я понимаю, что я наблюдаю неопределенное поведение. И я изначально путался между mutable и * const_cast *. Но тогда, не могли бы вы рассказать мне, для чего все сценарии, мы используем const_cast?

+1

AFAIR, изменяя константные переменные, считается неопределенным поведением. Вы можете ожидать, что что-то произойдет. – Spook

+5

Это неопределенное поведение. 'a' действительно const, поэтому вы не можете отбросить константу, не вызывая UB. – juanchopanza

+1

Компилятор, скорее всего, оптимизирует все экземпляры 'a' до фактического значения. –

ответ

4

От C++03 5.2.1 const_cast /7:

[Примечание: В зависимости от типа объекта, операции записи через указатель, именующий или указатель на элемент данных в результате из const_cast, что отбрасывает прочь константный-классификатор может производят неопределенное поведение (7.1.5.1). ]

В 7.1.5.1 The cv-qualifiers /4:

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

И, в разделе термины и определения:

[Примечание: допустима неопределенное поведение колеблется от полностью игнорируя ситуацию с непредсказуемыми результатами, для себя во время трансляции или выполнения программы в документированной (с выдачей диагностического сообщения или без него), до прекращения перевода или исполнения (с выдачей диагностического сообщения).

Незначительные изменения были внесены по последнему стандарту, но общая идея по-прежнему сохраняется. Итог, не делай этого.

1

C++ 11 Стандарт говорит:

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

Это означает, что вы ничего не можете ожидать, когда пытаетесь это сделать. Это может сработать, возможно, не может быть исключено исключение, программа может быть прекращена, в зависимости от того, как дизайнеры вашего компилятора разработали ее.