如何将“指针指针类型”转换为const?

时间:2013-11-11 15:44:54

标签: c++ const const-cast

使用以下代码

void TestF(const double ** testv){;}
void callTest(){
    double** test;
    TestF(test);
}

我明白了:

'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'

我无法理解为什么。 为什么test无法静默投放到const double**? 我为什么要明确地这样做?我知道

TestF(const_cast<const double**>(test)) 

使我的代码正确,但我认为这应该是不必要的。

我是否缺少一些关于 const 的关键概念?

2 个答案:

答案 0 :(得分:12)

该语言允许从double **const double *const *进行隐式转换,但不能转换为const double **。你尝试的转换会隐含地违反const正确性的规则,即使它不是很明显。

[事实上的标准] C ++ FAQ中的示例说明了问题

https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion

基本上,规则是:在某个间接级别添加const后,必须将const添加到所有间接级别,一直到右侧。例如,int *****无法隐式转换为int **const ***,但可以隐式转换为int **const *const *const *

答案 1 :(得分:10)

double **无法隐式转换为const double **是正确的。但是,它可以转换为const double * const *

想象一下这种情况:

const double cd = 7.0;
double d = 4.0;
double *pd = &d;
double **ppd = &pd;
const double **ppCd = ppd;  //this is illegal, but if it were possible:
*ppCd = &cd;  //now *ppCd, which is also *ppd, which is pd, points to cd
*pd = 3.14; // pd now points to cd and thus modifies a const value!

因此,如果您的函数不打算修改任何涉及的指针,请将其更改为const double * const *。如果它打算进行修改,您必须确定它所做的所有修改是否安全,因此可以使用const_cast,或者您是否真的需要传入const double **