Why D const is annoying
Jonathan M Davis
jmdavisProg at gmx.com
Wed May 2 00:12:23 PDT 2012
On Tuesday, May 01, 2012 23:48:29 Mehrdad wrote:
> In the world of OOP, when would "guarantee"ing (so to speak) 'physical'
> const-ness ever be handy?
>
> Wouldn't "physical" const-ness be an implementation detail of the object,
> and therefore, impossible to determine by the user of the object?
No, it's not an implementation detail. When you mark an object as being
physically const, then you're guaranteeing that you will not alter it through
that reference or pointer (and not at all, if it's a value type, because then
there can't be another reference or pointer which mutates it). The type system
guarantees this, because it disallows any const variable from being mutated.
When dealing with a const object, you can only call const functions on its
interface. Whatever implementation there is for those interface methods would
also have to be const to implement that interface. And the type system would
then disallow any non-const functions being called within the implementations
of those functions as well as disallowing the mutation of member variables.
So, the type system guarantees that the object will not be mutated at all by
any const function. And since const is part of the interface of the object, it
is very much _not_ an implementation detail.
Physical constness is _required_ in order to have immutable ever be converted
to const, because immutable objects can _never_ be mutated through _any_
reference or pointer. If D's const were not transitive as well as guarantee
that any const reference cannot alter the object it points to, then you
couldn't have immutable be convertible to const, because const would not
protect it against mutation. So, C++'s const is impossible in D if immutable
is going to be convertible to const.
It's _logical_ constness that is near-impossible to have the compiler verify,
because it has no way of determining that the variables that you mark as
mutable or from which you cast away const and mutate don't affect the logical
state of the object. _You_ may know, but the compiler can't determine that.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list