2013-03-29 46 views
2

我有做了代码或多或少:为什么无法隐式转换的char **为const char **

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

我的意思是,在酒吧的'函数签名()'你'为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。它’往往是一个好主意,要求之前检查常见问题(或只是谷歌)。

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; 
}