2012-07-20 6 views
0

Я экспериментировал с оператором const_cast и пытаюсь переопределить константный статус параметра о передаются в качестве аргумента:const_cast: переопределить константный статус

void function1 (const Object *o) 
{ 
    ... 
    function2(const_cast < Object *> (o)); //Exception in g++ 
} 

void function2 (Object *o) {} 

Но переопределение константного статуса O бросает исключение в г ++ (GNU/Linux), в VS 2010 (Win) он хорошо работает ...

Есть ли более надежный способ переопределения константного статуса параметра функции?

Update:

MSDN пишут:. Вы не можете использовать const_cast оператор непосредственно переопределить постоянный статус с постоянной переменной :-(

+5

Какое исключение вы получаете? Код, который вы опубликовали, отлично подходит для g ++. – Dani

+0

Пожалуйста, покажите нам, где вы называете 'function1()', и имейте в виду, что использование 'const_cast' для удаления константы из объекта по-настоящему const (в этом случае' const Object') приводит к неопределенному поведению, вплоть до исключения. – cdhowie

+3

Можете ли вы сделать код, который вы показываете * полный * (но все же минимальный) пример? Трудно понять, что вы видите из этого фрагмента. – Flexo

ответ

3

MSDN пишут: Вы не можете использовать оператор const_cast напрямую переопределить постоянный :-(статус с постоянной переменной.

const_cast позволяет лишить const спецификатор от указатель, но он не влияет на «статус константы» самого значения. Компилятор может решить поставить значение в постоянную память (ну, это const!), А затем попытка изменить его, даже через const_cast, может привести к нарушению доступа.

Вот фрагмент кода:

static const int A = 1; // it's constant, it might appear on a read-only memory page 
static int B = 2; // it's a regular variable 

const int* pA = &A; // a const pointer 
int* pB1 = &B; // a pointer 
const int* pB2 = &B; // a const pointer to regular variable 

*pA = 0; // Compiler error, we are not allowed to modify const 
*const_cast<int*>(pA) = 1; // Runtime error, although const specifier is stripped from the variable, it is still on read-only memory and is not available for updates 
*pB1 = 2; // OK 
*pB2 = 3; // Compiler error, we are not allowed to modify const 
*const_cast<int*>(pB2) = 4; // OK, we stripped const specifier and unlocked update, and the value is availalbe for update too because it is a regular variable 

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