2014-12-31 6 views
1

Solaris Studio генерирует самые загадочные сообщения об ошибках.Неправильное добавление константы? Ошибка: нельзя использовать char ** для инициализации const char **

158 char* inbufptr = buffer; 
159 char* outbufptr = outbuf; 
160 
161 const char** inbufptrpos = &inbufptr; 

И сообщение об ошибке:

line 161: Error: Cannot use char** to initialize const char**.

Почему это должно быть проблемой добавить константность? Я застрял, пожалуйста, помогите мне ...


memory: [m y _ c h a r _ a r r a y | inbufptr | inbufptr_pos] 
     ^      ^
      | (1)      | (2) 
      inbufptr     inbufptrpos 

Указатель символ * inbufptr указывает на начало массива, и не обещает держать ничего постоянного.

Теперь, если у меня теперь есть указатель char const ** inbufptr_pos, этот тип не обещает изменить содержимое массива, но я все равно могу изменить то, на что указывает указатель. Если я это сделаю, я не изменил массив, и я не вижу проблемы с этим.

ответ

3

Это извечная проблема, в результате чего интуитивно вы думаете, вы можете «добавить const Несс», но на самом деле добавление constНесс косвеннонарушаетconst -correctness.

Сам стандарт даже есть пример этого, чтобы помочь установить людей вернуться на правильный путь:

#include <cassert> 

int main() { 
    char* p = 0; 

    //char const** a = &p; // not allowed, but let's pretend it is 
    char const** a = (char const**)&p; // instead force the cast to compile 

    char const* orig = "original"; 
    *a = orig; // type of *a is char const*, which is the type of orig, this is allowed 

    assert(p == orig); // oops! char* points to a char const* 
} 
+0

Мой ответ был не таким уж плохим по сравнению с этим, или не так ли? Меня не волнует репутация, я просто хочу увидеть свою ошибку. Вы можете взглянуть, пожалуйста? :) – gsamaras

+0

@ G.Samaras: Вы не совсем поняли пример. –

+0

Не могли бы вы объяснить, почему я могу узнать из своей ошибки? :) – gsamaras

-1

Предположим, что это было законно.

char* inbufptr = buffer; 

const char** inpufptrpos = &inbufptr; 

Теперь вы можете изменить inbufptr, но inpufptrpos является const, таким образом, оно не должно быть изменено. Вы видите, что это не имеет большого смысла. Это как const не уважают!

С помощью this ответьте, я надеюсь, что это помогло! :)

+0

Да, я не думаю о том, что, спасибо, приятно вопрос, кстати @Beginner, +1! – gsamaras