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, этот тип обещает не изменять содержимое массива, но я все еще могу изменить, куда указывает указатель. Если я это сделаю, я не изменил массив, и я не вижу проблемы с этим.
Это извечная проблема, благодаря которой вы интуитивно думаете, что можете 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*
}
Предположим, это было законно.
char* inbufptr = buffer;
const char** inpufptrpos = &inbufptr;
Теперь вы можете изменить inbufptr
, но inpufptrpos
является const
Таким образом, это не должно быть изменено. Вы видите, что это не имеет особого смысла. Это как const
не соблюдается!
С помощью этот ответьте, надеюсь это помогло! 🙂