C ++之前的const
修饰符表示使用此指针时指向的值无法更改,而指针本身可以指向其他内容。在下面
void justloadme(const int **ptr)
{
*ptr = new int[5];
}
int main()
{
int *ptr = NULL;
justloadme(&ptr);
}
不应该允许 justloadme
函数编辑传递的param指向的整数值(如果有的话),同时它可以编辑int *值(因为const不在第一个星之后),但仍然为什么我在GCC和VC ++中都会遇到编译器错误?
GCC:错误:从int**
到const int**
的转换无效
VC ++:错误C2664:'justloadme':无法将参数1从'int **'转换为'const int **'。转换失去限定符
为什么说转换会失去限定符?是不是获得了const
资格赛?此外,它与我们传递非常量strlen(const char*)
char*
不相似
答案 0 :(得分:9)
大多数情况下,编译器是正确的,直觉是错误的。问题是如果允许那个特定的赋值你可能会破坏程序中的const正确性:
const int constant = 10;
int *modifier = 0;
const int ** const_breaker = &modifier; // [*] this is equivalent to your code
*const_breaker = & constant; // no problem, const_breaker points to
// pointer to a constant integer, but...
// we are actually doing: modifer = &constant!!!
*modifier = 5; // ouch!! we are modifying a constant!!!
标有[*]的行是该违规行为的罪魁祸首,因特殊原因而被禁止。该语言允许将const添加到最后一级但不是第一级:
int * const * correct = &modifier; // ok, this does not break correctness of the code