Неверное добавление констант? Ошибка: невозможно использовать char ** для инициализации const char **

Solaris Studio генерирует самые загадочные сообщения об ошибках.

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

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

строка 161: Ошибка: невозможно использовать char ** для инициализации const char **.

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


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

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

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

1

Решение

Это извечная проблема, благодаря которой вы интуитивно думаете, что можете 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*
}
3

Другие решения

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

char* inbufptr = buffer;

const char** inpufptrpos = &inbufptr;

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

С помощью этот ответьте, надеюсь это помогло! 🙂

-1

По вопросам рекламы [email protected]