const双指针参数的非const指针参数

时间:2010-08-09 07:36:39

标签: c++ function pointers type-conversion const

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*不相似

1 个答案:

答案 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