[英]passing dynamically declared array as constant in 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;
}
我想将结果数组作为常量参数传递给函数。 我希望函数内的数组为“只读”。
func(const double ** array)
{
// computations using array
}
但是我收到以下错误: invalid conversion from 'double**' to 'const double**'
有可能做这样的事情吗?
OP之所以签名
func(const double ** array){
// computations using array
}
当将double **
作为参数传递时,会产生错误,这double **
资格转换的规则。
引用https://en.cppreference.com/w/cpp/language/implicit_conversion (重点是我的):
资格转换
“更多”具有简历资格意味着
- 指向非限定类型的指针可以转换为指向const的指针;
- [...]
对于多级指针,以下限制适用: cv 1 0合格指针cv 1 1合格指针... ... cv 1 n-1合格指针cv 1 n合格指针T1转换为多级指针P2其是CV 2 0 -qualified指向cv 2 1 -qualified指针... CV 2 n-1个 -qualified指向cv 2 n个 -qualified只有T如果
- 两个指针的级别数n相同;
- 如果在P1的某个级别(零级别除外)的cv 1 k资格中存在const,则在P2的相同cv 2 k级别中存在const;
- [...]
- 如果在某个k级别,P2比c1更具有cv资格,则在p2的每个单个级别(零级别除外)上都必须有一个常量,直到k : cv 2 1 , cv 2 2 ... cv 2 k 。
- [...]
- 非多级资格转换的规则解决了零级问题。
\n char ** p = 0;\n const char ** p1 = p; //错误:等级2更具有简历资格,但等级1不是const\n const char * const * p2 = p; //好:再通过2级cv认证,并且 \n //在第1级添加const\n请注意,在C编程语言中,只能将const / volatile添加到第一级:
\n char ** p = 0;\n char * const * p1 = p; //在C和C ++中可以\n const char * const * p2 = p; // C中的错误,在C ++中可以\n
因此,为了增强一致性,需要将签名更改为
void func(double const * const * array) {
// ... ^^^^^
}
也就是说,我强烈建议更改整体设计,并尽可能避免使用动态分配的锯齿状数组。
您可以使用const_cast
向对象添加常量(需要显式强制const_cast
)。
double **p = allocate_2d(100,200);
// populate p
func(const_cast<const double**>(p));//array pointed by p will be read only inside func
不过,您仍然需要考虑是否根本需要const
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.