2010-08-09 4 views
5

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

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

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

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

GCC: ошибка: неправильное преобразование int**const int** в

VC++: ошибка C2664: 'justloadme': не удается преобразовать параметр 1 из 'междунар **' до 'Const INT **. Конверсия теряет квалификаторы

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

+4

http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 – Anycorn

ответ

8

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

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!!! 

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

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

Хотя это приятно что для запрета этого «const» изменяющего фиаско компилятор делает это. Но использование 'int * const * correct' даже не позволит мне делать' * ptr = new int [5]; '. Что я делаю? – legends2k

+1

Проблема, скорее всего, в том, что то, что вы хотите сделать, это не то, что вы пишете. Что вы хотите сделать? Подпись принимает 'const int **', но вы передаете 'int **' и рассматриваете ее внутри функции как 'int **' ... вы действительно хотите, чтобы 'const' в сигнатуре? –

+1

О, теперь я понял! То, что я пытаюсь сделать, концептуально неверно, так что да, вы правы. Благодаря! – legends2k

Смежные вопросы