Tail Const (Was: I closed a very old bug!)

Simen Kjærås simen.kjaras at gmail.com
Thu Jan 18 09:15:04 UTC 2018


On Wednesday, 17 January 2018 at 10:36:44 UTC, Jonathan M Davis 
wrote:
> D is quite useable without tail-const, but without it, ranges 
> and const can't be used together. The solution that most of us 
> have taken is basically to give up on const. Having tail-const 
> would be better, but implementing it without language support 
> is a royal pain and not the sort of thing that most of us are 
> going to bother with. It's just easier to give up on const. It 
> would be a _lot_ nicer if we could figure out how to cleanly 
> add tail-const to the language.

Sadly, constness doesn't propagate in a straightforward way - the 
equivalent const type for Foo!(int, int) could be Foo!(int, 
const(int)), Foo!(const(int), int), or Foo!(const(int), 
const(int)), and there's no way to specify this. At least in 
theory, it might even be that the const version is an entirely 
different template instantiation, so even something like `struct 
Foo(T, inout U)` might not be good enough. We might decide not to 
support anything as weird as different template overload sets, 
though.

If we look at what we already have, the basic building block is 
std.traits.Unqual. What's needed is a hook for those cases where 
Unqual!(const(R!T)) shouldn't simply be R!T. If Unqual tested for 
a member, e.g. "Unqual", and returned that type, that's important 
parts of the issue solved.

"Unqual" would probably be on the form 'alias Unqual(this T) = 
Foo!(CopyTypeQualifiers!(T, Args));'.

The big thing missing after amending Unqual like this, is 
implicit conversion. Currently, const(Foo!T) is generally not 
implicitly convertible to Foo!(const(T)). Since D templates are 
complex beasts, again there's not necessarily a straightforward 
way to do this. Alias this is some help, but trying to get that 
to work I ran into https://issues.dlang.org/show_bug.cgi?id=18260.

At any rate, this is a topic for a DIP.

--
   Simen


More information about the Digitalmars-d mailing list