将非const多维数组传递给不会更改它的函数

时间:2012-12-31 16:51:12

标签: c++ multidimensional-array const argument-passing

  

可能重复:
  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)?

由于

1 个答案:

答案 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 *的函数,因为它的规则更简单。