可能重复:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)
我正在编写一个以2D数组作为输入的函数,并且不会更改基础值,我想在函数声明中明确指定它。我对这段代码感到有点困惑(这显然只是一个简单的虚拟代码来说明我的问题):
int doNotChangeA(int const *a){
return a[0]+3;
}
int doNotChangeC(int const **c){
return c[0][0]+3;
}
int main(){
int *a= new int[1];
a[0]= 5;
int b= doNotChangeA(a);
delete []a;
int **c= new int*[1];
c[0]= new int[1];
c[0][0]= 6;
int d= doNotChangeC(c);
delete []c[0];
delete []c;
return 0;
}
此代码产生编译错误:
cst.cpp:19: error: invalid conversion from ‘int**’ to ‘const int**’
cst.cpp:19: error: initializing argument 1 of ‘int doNotChangeC(const int**)’
所以,我有点困惑 - 为什么第一部分(传递给doNotChangeA的非const 1D数组)被允许而第二部分(传递给doNotChangeC的非const二维数组)不被允许?
基本上我想做的是让c为int **,它指向非const值,因为我想在调用doNotChangeC之前和之后做任何我想做的事情。当然,我可以将doNotChangeC更改为仅使用int **而不是int const **,这将“修复”问题,但我想明确表明doNotChangeC不会更改底层的2-D数组。
是正确的做法:
int d= doNotChangeC( const_cast<int const**>(c) );
这编译很好,但我很困惑为什么第一部分不需要这个,即1-D数组(doNotChangeA)?
由于
答案 0 :(得分:2)
这需要
int doNotChangeC(int const *const *c){
return c[0][0]+3;
}
如果没有额外的const,你的函数就能做到这样的事情:
int doNotChangeC(int const **c){
c[0] = &something_else;
return c[0][0]+3;
}
请注意,这与C的工作方式不同。在C中,您仍然无法将int **
传递给带int const *const *
的函数,因为它的规则更简单。