With the following code
void TestF(const double ** testv){;}
void callTest(){
double** test;
TestF(test);
}
I get this:
'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
I cannot understand why.
Why test
cannot be silently casted to const double**
?
Why should I do it explicitly? I know that
TestF(const_cast<const double**>(test))
makes my code correct, but I feel this should be unnecessary.
Are there some key concepts about const that I'm missing?
The language allows implicit conversion from double **
to const double *const *
, but not to const double **
. The conversion you attempt would implicitly violate the rules of const correctness, even though it is not immediately obvious.
The example in the [de-facto standard] C++ FAQ illustrates the issue
https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion
Basically, the rule is: once you add const
at some level of indirection, you have to add const
to all levels of indirection all the way to the right. For example, int *****
cannot be implicitly converted to int **const ***
, but it can be implicitly converted to int **const *const *const *