2013-03-29 2 views
2

У меня есть код, который делает более или менее:Почему не удается неявно преобразовать символ ** на константный символ **

bar(const char**) 
{ 
// stuff 
} 

foo(char** arr) 
{ 
    bar(arr); 
} 

Компилятор уведомляет меня, что я делаю в invalid conversion from ‘char**’ to ‘const char**’. Хотя я знаю, что это значит, я не понимаю, почему это не допустимо. Это нормально нормально char* где const char* не требуется.

+1

У вас нет дополнительной '*' в сигнатуре функции? –

+0

Вы имеете в виду ... 'bar (const char **)'? –

+0

Я имею в виду, что в сигнатуре функции 'bar()' у вас есть 'const char ***', есть 3 звездочки. Разве вы не имели в виду, возможно, двух? –

ответ

1

потому что, если это разрешено, вы можете непреднамеренно изменить то, что было объявлено const.

вот конкретный пример злоупотребления, если правила позволили этому:

char const* s = "a literal, very const"; 

bar(const char** pp) 
{ 
    *pp = s; 
} 

foo(char** arr) 
{ 
    bar(arr); 
    char* unconsted_s = *arr; 
    unconsted_s[0] = 'X'; 
} 

Это также FAQ. Это часто рекомендуется проверить FAQ (или просто Google), прежде чем спрашивать.

0

Это может привести к аналогичному сценарию, если это разрешено.

void foo(int** arr) 
{ 
    /*Can freely modify value at location pointed by a*/ 
    **arr = 6; 
} 


int main() 
{ 
/*Pointer to constant*/ 
int i = 5; 

const int* a =&a; 

/*Not a pointer to constant*/ 
int** aa= &a; 

foo(aa); 

return 0; 
}