Range over a container r-value with disabled postblit

kinke noone at nowhere.com
Sun Jan 14 14:04:46 UTC 2018


On Sunday, 14 January 2018 at 01:38:17 UTC, Nordlöw wrote:
> My current proposal for a solution is to make `byElement` a 
> free unary function
>
>     byElement(auto ref X x)
>
> which statically checks via
>
>     static if (__traits(isRef, x))
>
> whether the `X`-instance is passed as either an
>
> - l-value, where my current solution works (ByLvalueElement), or
> - r-value, in which the X-instance instead is moved into range 
> (ByRvalueElement).

That sounds reasonable. For something like `foreach (e; 
makeRange().wrapRangeByRef())`, referencing the makeRange() 
struct rvalue by pointer in the wrapped range won't work, as the 
underlying range lifetime ends with the foreach range expression, 
while the wrapped range's lifetime extends to the end of the 
foreach loop. So making the wrapped range take ownership of a 
range rvalue by moving it into a member (of ByRvalueElement) 
makes sense IMO.
Lvalues aren't moved implicitly by the compiler, so referencing 
them by pointer (&this) is safe.


More information about the Digitalmars-d-learn mailing list