On 2010-11-29 13:08:54 -0500, Andrei Alexandrescu <seewebsiteforem...@erdani.org> said:

On 11/29/10 10:54 AM, Michel Fortin wrote:
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)?

const should follow normal logic, and const(Rebindable!(const C)) should behave as expected.

I think we agree on that.

The problem is that you now have two distinct types to mean a const reference to a const object. You have "const(Rebindable!(const C))" and const "const(C)", whichever you get depends on where the type comes from. Type equality won't work between the two, and you won't be able to concatenate two arrays one containing rebindables and the other (for instance). It's like a special case in the type system where constness is implemented using a template while the rest is a language feature, it it thus behave differently and code that might work for one implementation of constness might break with the other, because the don't play with each other very well. Add immutable to the mix and it becomes even stranger.

For instance, here's a tricky question: should Unqual!(const C) give you a const(C), a Rebindable!(const C), or simply C? Now, what should const(Unqual!(immutable C)) give you?

I know most of the problems are going to be edge cases most people don't care about. But on the whole, creating a fragile and complex solution to work around the lack of an inspiring syntax seems rather silly. I would immensely prefer having an ugly syntax that works as it should. If it's too ugly, we can still hide that syntax behind Rebindable by defining it as a simple type alias.


--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/

Reply via email to