July 21, 2012
On Friday, July 20, 2012 17:15:53 Ellery Newcomer wrote:
> On 07/19/2012 06:09 PM, Ellery Newcomer wrote:
> > On 07/19/2012 02:51 AM, Artur Skawina wrote:
> >> Range!Node opSlice() { return Range!Node(first); }
> >> Range!(const Node) opSlice() const { return Range!(const
> >> 
> >> Node)(first); }
> 
> it looks like you could almost merge these two into one using inout, but I'm not sure what you do about selecting the return type.

If everywhere that you use const, you can use inout, then it may work. But the return type is not only a difference in constness. It's a completely different type.

The other problem is that the const opSlice is actually _very_ broken as far as range-based functions typically go. Whil opSlice doesn't technically require it (though it probably should), it's _very_ common for function using opSlice to assign the result to the original range, and that's not possible with this code.

I keep meaning to bring it up for discussion in the newsgroup, but it's a big problem. You basically need tail-const, and I don't know of any way to implement it, because the only way to get implicit conversions is to use alias this, and that results in a recursive template instantiation, which kills the compiler. I don't think that it's actually possible to properly implement a const opSlice for many ranges right now.

- Jonathan M Davis
1 2
Next ›   Last »