How to separarte lvalue parameter from rvalue?

Rachel Wilson rachel at vectle.com
Thu Oct 8 23:33:42 UTC 2026


the trait youre looking for is __traits(isRef, data). with an 
auto ref parameter you can do the whole thing in one function 
instead of the compiles trick:

```d
auto asBits(D)(auto ref D data)
{
     static if (__traits(isRef, data) && isMutable!D)
         return BitsRefSlice!D(&data, 0, D.sizeof * 8);
     else
         return BitsValSlice!D(data, 0, D.sizeof * 8);
}
```

isRef tells you whether the argument actually bound by reference, 
so immutable lvalues and rvalues fall through to the by-value 
branch naturally. isMutable is from std.traits. one caveat: the 
by-value branch has to copy the data before slicing, since an 
rvalue is gone by the time the expression ends.

On Monday, 14 September 2026 at 11:02:49 UTC, realhet wrote:
> On Monday, 14 September 2026 at 10:51:38 UTC, realhet wrote:
>> Hi! I try to make the easiest syntax for manipulating bits.
>
> Update: This way I it works, but I think I'm abusing it.
>
> ```d
> auto asBits(D)(ref D data)
> {
> 	static if(__traits(compiles, data = data))	return 
> BitsRefSlice!D(&data, 0, D.sizeof*8);
> 	else	return BitsValSlice!D(data, 0, D.sizeof*8);
> }
> auto asBits(D)(D data)
> => BitsValSlice!D(data, 0, D.sizeof*8);
> ```
>
> Somebody please tell me what's the best practice for this.



More information about the Digitalmars-d-learn mailing list