What is the difference between...
Daniel Keep
daniel.keep.lists at gmail.com
Fri Sep 7 05:48:11 PDT 2007
Janice Caron wrote:
> -----Original Message-----
> From: digitalmars-d-bounces at puremagic.com
> [mailto:digitalmars-d-bounces at puremagic.com] On Behalf Of Daniel Keep
> Sent: 07 September 2007 12:58
> To: digitalmars-d at puremagic.com
> Subject: Re: What is the difference between...
>
>> const(T) only has an effect on reference types.
>
> O-Kaaaay.
>
> Forgive me, but, that seems arbitrary and ... silly. If const(T) worked
> on all types, we'd have no need for const T, surely?
>
> So, let's see if I've understood this right. Given
>
> struct S { int x; } /* a non-reference type */
> class C { int x; } /* a reference type */
>
> void f(const(S) s, const(C) c)
> {
> s.x = 5; /* allowed */
> c.x = 5; /* not allowed */
> }
>
> Is that really, really right? It's going to take me a long time before
> that seems intuitive!
I get the feeling you haven't read the various articles on how const
works in D 2.0...
D 2.0 adds, basically, five kinds of const.
1. "final" (storage class) -- makes a variable's bits immutable after
the relevant constructor has finished (so this() for classes, static
this() for modules) or immediately after it's been assigned to. Does
not produce a literal constant in ROM.
2. "const" (storage class) -- makes a variable's bits immutable at
compile time, and transitively adds const(T) to the stored type.
3. "invariant" (storage class) -- makes a variable's bits immutable at
compile time, and transitively adds invariant(T) to the stored type.
4. "const(T)" (type constructor) -- turns any reference type T into a
read-only view of the referenced data; has no effect on non-reference types.
5. "invariant(T)" (type constructor) -- turns any reference type T into
a *globally immutable* view of the referenced data. This means that not
only can't you make changes, no one else can, either. Has no effect on
non-reference types.
What you have to realise is that D 2.0's const system is *NOT* the same
as C's, C++'s, D 1.0's or anyone else's. Yes, it's weird when you first
see it, but there are good reasons for it being the way it is.
Here's some links:
* http://www.digitalmars.com/d/const.html
* http://while-nan.blogspot.com/2007/06/you-cant-touch-this.html (note:
this was written before D 2.0 was released and doesn't contain the
storage class versions of "const" and "invariant", but should otherwise
be correct).
-- Daniel
More information about the Digitalmars-d
mailing list