On Thursday, 2 September 2021 at 17:17:15 UTC, DLearner wrote:
Surely there is no inconsistency - at run time the array is in
a fixed place, so ArrPtr is (or at least should be) a
constant, but the contents of the array
can vary as the program runs.
In the case of `immutable(T)* ArrPtr`, the contents of the
pointed-to array cannot vary as the program runs. If it's
immutable, nothing in the program ever mutates it. In the case of
`const(T)* ArrPtr`, the contents of the pointed-to array can vary
as the program runs, and the only restriction is that the array
can't be mutated through ArrPtr.
If what you mean is that you want the *pointer* to never change,
`T * const ArrPtr` in C syntax, but that you don't care if the
pointed-to array changes via ArrPtr or any other reference, then
I don't think D can express this. You could make ArrPtr a
function:
```d
void main() {
int[] xs = [1, 2, 3, 4];
int* p() { return &xs[2]; }
p[0] = 0;
assert(xs == [1, 2, 0, 4]);
p++; // Error: ... not an lvalue and cannot be modified
}
```