C++ 在c+;中将动态声明的数组作为常量传递+;

C++ 在c+;中将动态声明的数组作为常量传递+;,c++,C++,我使用如下函数动态创建了一个数组: //.. double ** allocate_2d(const int wd1, const int wd2){ double **array = new double*[wd1]; for(int idx=0; idx<wd1; idx++) { array[idx] = new double[wd2]; } return array; } 但是,我得到以下错误: 从'double

我使用如下函数动态创建了一个数组:

//..
    double ** allocate_2d(const int wd1, const int wd2){
    double **array = new double*[wd1];

    for(int idx=0; idx<wd1; idx++)
    {
        array[idx] = new double[wd2];
    }

    return array;
}
但是,我得到以下错误:
从'double**'到'const double**'的转换无效。


可以这样做吗?

您可以使用
const\u cast
向对象添加constness(需要显式cast)

double**p=allocate_2d(100200);
//填充p
func(const_cast(p))//由p指向的数组将在func内只读

您仍然需要考虑是否需要<代码> const <代码>。

为什么OP的签名

func(const double ** array){
    // computations using array
}
在限定转换规则中将
double**
作为参数传递时生成错误

引用(重点):

资格转换

  • 指向类型T的of类型指针可以转换为指向同一类型T的morecv限定值的prvalue指针(换句话说,可以添加常量和波动性)
  • [……]
“更多”是指

  • 指向非限定类型的指针可以转换为指向常量的指针
  • [……]
对于多级指针,以下限制适用:多级指针P1是指向cv11的cv10限定指针。。。cv1n-1—指向cv1n限定T的限定指针可转换为多级指针P2,该多级指针P2是指向cv21的cv20限定指针—指向。。。cv2n-1-指向cv2n限定T的限定指针,仅当

  • 两个指针的级别n数相同
  • 如果P1的某个级别(零级除外)的cv1k鉴定中存在常数,则P2的同一级别cv2k中存在常数
  • [……]
  • 如果在某个级别k,P2的cv合格率高于P1,则在k之前,P2的每个级别(零级除外)都必须有常量:cv21、cv22。。。cv2k
  • [……]
  • 零级由非多级资格转换规则解决

<>这句话,我强烈建议改变总体设计,避免可能动态分配的锯齿数组,如果可能的话,

在C++中,每当你想到“动态数组”时,你的下一个想法几乎总是应该是<代码> STD::vector < /代码>。使用
std::vector
您将不会遇到现在的问题(我知道有重复的,尽管我似乎找不到)。谢谢。我试试看。我仍然想了解它是什么工作。而且,在C++中,如果你关心性能和效率(通常是为什么选择C++),每当你想到“多维数组”时,你的下一个想法应该是将其元素存储在一维数组中;查看为什么不允许这样做。不,解决方法是使
func
定义正确。不,人们肯定不会这样做。如果您想表示函数不修改参数,可以将参数标记为
const
,这样编译器就可以防止修改,并确保传递正确的类型。@mark Ingram,是的,这可能是正确的解决方案。然而,人们有时确实会使用
const
让其他人知道对象在当前状态下没有更改function@MarkIngram,我的意思是说函数不修改对象,而不是参数(我在评论中更正了这一点)@dsp_user类的方法背后的常数与此问题无关。您应该尝试解释为什么OP最初尝试的
const double**array
不起作用。
double **p = allocate_2d(100,200);

// populate p

func(const_cast<const double**>(p));//array pointed by p will be read only inside func
func(const double ** array){
    // computations using array
}
char** p = 0; const char** p1 = p; // error: level 2 more cv-qualified but level 1 is not const const char* const * p2 = p; // OK: level 2 more cv-qualified and // const added at level 1 char** p = 0; char * const* p1 = p; // OK in C and C++ const char* const * p2 = p; // error in C, OK in C++
void func(double const * const * array) {
    // ...               ^^^^^ 
}