Я пытаюсь скомпилировать следующий фрагмент кода, но я получаю ошибку C2440 (визуальная студия). Я пробовал искать другие ресурсы для помощи, но я не могу найти хорошее объяснение.
int main()
{
int a = 100;
SomeFunction(&a);
}
void SomeFunction(const int* value)
{
//This line of code gives me the error.
int* variable = value;
cout << "Value is " << *Variable << " end" << endl;
}
Я знаю, что могу решить эту проблему, используя int* variable = const_cast<int*> (value);
, но я все еще не понимаю, почему приведенный выше код вызывает проблему.
Ошибка вполне понятна - преобразование указателя не может удалить определитель const
; в противном случае вы могли бы нарушить постоянство:
int* variable = value; // Not allowed - but if it were...
*variable = 42; // BOOM! changed a constant.
Если вы не хотите, чтобы можно было изменить значение, на которое указывалось, тогда сохраните его const
const int* variable = value;
Если вы хотите изменить его, то не делайте его const
в первую очередь:
void SomeFunction(int* value)
Я знаю, что могу решить эту проблему, используя
const_cast
Это плохая идея - вы получите неопределенное поведение, если вы злоупотребляете const_cast
и пытаетесь изменить постоянный объект. Вы должны использовать const
где можете, но не тогда, когда хотите что-то изменить.
Константа const int*
означает, что у вас есть адрес int
который вам не разрешено изменять.
int*
может использоваться для изменения int
который указывает. Очевидно, что это нарушает приведенное выше утверждение о том, что вам не разрешено его изменять.
const_cast
фактически не "решает проблему". Он позволяет вам просить изменить то, что не может быть изменено. Такая попытка может привести к сбою вашей программы неконтролируемыми способами (формально, неопределенное поведение). В вашем конкретном примере переменная a
в main
не const
, и поэтому const_cast
ее успешно изменит. Но это создает тесную связь и противоречит обещанию, выполняемому функцией, чья подпись const int*
.
int* variable = value;
неправильно.
Должен быть,
int variable = *value
а также
cout << "Value is " << variable << " end" << endl;
const int *
означает, что функция гарантирует, что значение по этому адресу не изменится, но если вы можете сделать:
int * variable = value;
Тогда вы также можете сделать
*variable=30;
При этом гарантируется гарантия функции со указателем const.
const int* variable = value;
const int*
в не const?