我有做了代码或多或少:为什么无法隐式转换的char **为const char **
bar(const char**)
{
// stuff
}
foo(char** arr)
{
bar(arr);
}
编译器会通知我,我做一个invalid conversion from ‘char**’ to ‘const char**’
。虽然我知道这意味着什么,但我不明白为什么不允许。完全可以通过char*
,其中const char*
是必要的。
我有做了代码或多或少:为什么无法隐式转换的char **为const char **
bar(const char**)
{
// stuff
}
foo(char** arr)
{
bar(arr);
}
编译器会通知我,我做一个invalid conversion from ‘char**’ to ‘const char**’
。虽然我知道这意味着什么,但我不明白为什么不允许。完全可以通过char*
,其中const char*
是必要的。
,因为如果它被允许,那么你可以在不经意间改变被宣布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。它’往往是一个好主意,要求之前检查常见问题(或只是谷歌)。
如果允许它可以导致类似的情景。
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;
}
在函数签名中没有额外的'*'吗? –
你的意思是......'bar(const char **)'? –
我的意思是,在酒吧的'函数签名()'你'为const char ***',有3个星号。你不是有意要两个吗? –