аргумент неконстантного указателя на параметр константного двойного указателя - PullRequest
6 голосов
/ 09 августа 2010

Модификатор const в C ++ перед звездочкой означает, что с помощью этого указателя нельзя изменить значение, на которое указывает указатель, а сам указатель можно сделать так, чтобы он указывал на что-то другое. В ниже

void justloadme(const int **ptr)
{
    *ptr = new int[5];
}

int main()
{
    int *ptr = NULL;
    justloadme(&ptr);
}

justloadme функция не должна позволять редактировать целочисленные значения (если они есть), указанные переданным параметром, в то время как она может редактировать значение int * (поскольку const не после первой звезды), но все же зачем Я получаю ошибку компилятора в GCC и VC ++?

GCC: ошибка: недопустимое преобразование из int** в const int**

VC ++: ошибка C2664: «justloadme»: невозможно преобразовать параметр 1 из «int **» в «const int **». Конверсия теряет квалификаторы

Почему говорится, что конверсия теряет классификаторы? Разве он не получает квалификатор const? Более того, разве это не похоже на strlen(const char*), где мы передаем неконстантный char*

1 Ответ

9 голосов
/ 09 августа 2010

Как обычно, компилятор прав, а интуиция неправильна. Проблема в том, что если бы это конкретное назначение было разрешено, вы могли бы нарушить правильность const в вашей программе:

const int constant = 10;
int *modifier = 0;
const int ** const_breaker = &modifier; // [*] this is equivalent to your code

*const_breaker = & constant;   // no problem, const_breaker points to
                               // pointer to a constant integer, but...
                               // we are actually doing: modifer = &constant!!!
*modifier = 5;                 // ouch!! we are modifying a constant!!!

Строка, помеченная [*], является виновником этого нарушения и запрещена по этой конкретной причине. Язык позволяет добавлять const к последнему уровню, но не к первому:

int * const * correct = &modifier; // ok, this does not break correctness of the code
...