Не удается преобразовать из const int * в int *

0

Я пытаюсь скомпилировать следующий фрагмент кода, но я получаю ошибку 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); , но я все еще не понимаю, почему приведенный выше код вызывает проблему.

  • 0
    Попробуйте: const int* variable = value;
  • 16
    Почему вы хотите преобразовать const int* в не const?
Показать ещё 3 комментария
Теги:

4 ответа

17
Лучший ответ

Ошибка вполне понятна - преобразование указателя не может удалить определитель 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 где можете, но не тогда, когда хотите что-то изменить.

11

Константа const int* означает, что у вас есть адрес int который вам не разрешено изменять.

int* может использоваться для изменения int который указывает. Очевидно, что это нарушает приведенное выше утверждение о том, что вам не разрешено его изменять.

const_cast фактически не "решает проблему". Он позволяет вам просить изменить то, что не может быть изменено. Такая попытка может привести к сбою вашей программы неконтролируемыми способами (формально, неопределенное поведение). В вашем конкретном примере переменная a в main не const, и поэтому const_cast ее успешно изменит. Но это создает тесную связь и противоречит обещанию, выполняемому функцией, чья подпись const int*.

2

int* variable = value; неправильно.

Должен быть,

int variable = *value

а также

cout << "Value is " << variable << " end" << endl;

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

const int * означает, что функция гарантирует, что значение по этому адресу не изменится, но если вы можете сделать:

int * variable = value;

Тогда вы также можете сделать

*variable=30;

При этом гарантируется гарантия функции со указателем const.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню