Head Const
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Tue Feb 16 07:33:03 PST 2016
On Tuesday, 16 February 2016 at 15:12:00 UTC, Ola Fosheim Grøstad
wrote:
> On Tuesday, 16 February 2016 at 15:10:40 UTC, Timon Gehr wrote:
>> Legal.
>
> Ouch... :-/
const guarantees that the data will not be mutated via that
reference to the data. It guarantees nothing about other
references to that data. For that, you need immutable. But as
long as const guarantees that the data can't be mutated via that
reference, then there's plenty of code where the programmer can
look at it and know for sure that that data isn't being mutated,
because they know that the code in question can't have access to
the same data via a mutable reference (the compiler can see that
too, but in a much more limited fashion than a programmer is
going to be able to know).
If casting away const and mutating is defined behavior, then you
lose that guarantee, and instead of knowing that some code
doesn't have access to a mutable reference to that data being
enough, you have to actually know what the code does to know that
it's not casting away const and mutating.
Having @mutable would be better than allowing casting away const
and mutating to be defined behavior (at least when the underlying
data is mutable rather than immutable), because it would at least
restrict the data that can be mutated, and it would guarantee
that you don't accidentally mutate an immutable variable (since
it would make no sense to have a type with an @mutable member be
immutable, whereas if you're casting away const, getting that
right would be completely up to the programmer). But having
@mutable would still mean that you can't rely on a const
variable not being mutated when you pass it to a function that
you know doesn't have access to a mutable reference to the same
data. If you knew that no @mutable was involved, it would be the
same as now, but you'd have to know for sure that @mutable was
involved, and even if it isn't now, it could be later after
refactoring.
So, having @mutable would be far better than having it be defined
behavior to cast away const and mutate (assuming that the
underlying data is mutable rather than immutable), but you're
still losing out on guarantees that we have now. After all, most
code isn't going to do the equivalent of
// prototype f(const A *, A*);
f(ptr,ptr);
Ultimately, I think that the question is whether the guarantees
that we currently get with const are worth more or whether the
idioms that don't work with const right now but would work with
@mutable are worth more. But regardless, the guarantees provided
by const obviously pale in comparison to the ones that immutable
provides.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list