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?
We declare a constant pointer. First, we assign the address of variable 'a' to the pointer 'ptr'. Then, we assign the address of variable 'b' to the pointer 'ptr'. Lastly, we try to print the value of the variable pointed by the 'ptr'.
A pointer to a const value (sometimes called a pointer to const for short) is a (non-const) pointer that points to a constant value. In the above example, ptr points to a const int . Because the data type being pointed to is const, the value being pointed to can't be changed. We can also make a pointer itself constant.
In the constant pointers to constants, the data pointed to by the pointer is constant and cannot be changed. The pointer itself is constant and cannot change and point somewhere else.
Returning a pointer to const makes a lot of sense, but returning a const pointer (you cannot modify) usually adds no value (although some say it can prevent user errors or add compiler optimisation).
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 *
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With