D's greatest mistakes
Michel Fortin
michel.fortin at michelf.com
Mon Nov 29 08:54:25 PST 2010
On 2010-11-29 11:19:29 -0500, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> said:
> Syntax is the main issue in implementing this feature. Due to the
> implicit nature of reference semantics for classes, there was no syntax
> to distinguish between the head and the tail when qualifying.
>
> FWIW I just thought of this syntax. It might work but it's not intuitive:
>
> const()C tailConst;
I proposed the following a while ago. First allow the class reference
to (optionally) be made explicit:
C a; // mutable reference to mutable class
C ref b; // mutable reference to mutable class
And now you can apply tail-const to it:
const(C)ref c; // mutable reference to const class
const(C ref) d; // const reference to const class
const(C) e; // const reference to const class
I think it's better.
> Ultimately I believe we need to make Rebindable palatable. That would
> have the nice side effect of enabling other proxy types.
The biggest problem I see is with generic programming. Say I pass
Rebindable!(const C) as a template argument, then the template wants to
make it const: should it become const(Rebindable!(const C)), or will
this be resolved to const(C)?
You don't have this problem with pointers: const(const(int)*) is the
same type as const(int*). If 'const' was a template, you could
specialize it to do the same for Rebindable. But 'const' is a language
thing, and it seems utterly inappropriate to make const aware of
Rebindable so that const(Rebindable!...)) would drop the Rebindable,
and thus you get the above silliness.
I'm all for making proxy types work better, but it'll always feel
patchy in this case.
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list