2012-04-30 2 views
2

Можно создать дубликат:
Implicit cast from char** to const char**Объяснение: Преобразование 'символ **' до 'сопзЬ гольца **', преобразование теряет отборочные

Учитывая следующий код:

void foo(const char ** buffer); 

void bar() 
{ 
    char * buffer; 
    foo(&buffer); 
} 

Почему функция foo() имеет параметр const char *, компилятор d Не жалуетесь, когда передаете в него переменную char *? Но при использовании char ** он не может преобразовать его в const char **? Добавляет ли компилятор какие-либо квалификаторы const в первом случае?

Я прочитал раздел 4.4 стандарта C++, и это еще больше смутило меня.

ответ

3

Да, вы не можете неявно конвертировать из T ** в const T **, поскольку компилятор больше не может гарантировать, что constness не будет нарушена.

Рассмотрим следующий код (заимствованных из часто задаваемых вопроса C на именно этой теме: Why can't I pass a char ** to a function which expects a const char **?):

const char c = 'x'; 
char *p1; 
const char **p2 = &p1; // 3 
*p2 = &c; 
*p1 = 'X';    // 5 

Если компилятор позволил линии 3, то строка 5 будет в конечном итоге запись в const объекта.

+1

Как изменить код, указанный выше, чтобы компилировать его правильно? – MarkP

2

Рассмотрим:

char const someText[] = "abcd"; 

void 
foo(char const** buffer) 
{ 
    *buffer = someText; 
} 

void 
bar() 
{ 
    char* buffer; 
    foo(&buffer); 
    *buffer = 'x'; 
} 

Если бы это было законным, то можно было бы изменить константный объект без промежуточного const_cast. Преобразование запрещено , поскольку оно нарушает константу.

1

Возможно, вы запутываете уровень косвенности, к которому относится константа.

char** может быть описан как pointer to a pointer to a character тогда как const char** может быть описан как pointer to a pointer to a constant character.

Так что, когда мы пишем это по-разному, мы имеем pointer to A (где A = pointer to character), и мы имеем pointer to B (где B = pointer to a constant character).

Очевидно, теперь (я надеюсь) A и B являются различными типами, поскольку такой указатель на A не может быть назначен указателю на B (и наоборот).

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