Assignment of tuples
Steven Schveighoffer
schveiguy at gmail.com
Wed May 20 13:51:05 UTC 2020
On 5/20/20 8:17 AM, Russel Winder wrote:
> So I have an enum:
>
> enum RC5Command: Tuple!(ubyte, ubyte) {
> Standby = tuple(to!ubyte(0x10), to!ubyte(0x0c)),
> …
>
> I can do:
>
> RC5Command rc5command = RC5Command.CD;
>
> However, if I do:
>
> rc5command = RC5Command.BD;
>
> I get:
>
> source/functionality.d(80,16): Error: template std.typecons.Tuple!(ubyte, ubyte).Tuple.opAssign cannot deduce function from argument types !()(RC5Command), candidates are:
> /usr/lib/ldc/x86_64-linux-gnu/include/d/std/typecons.d(900,19): opAssign(R)(auto ref R rhs)
> with R = RC5Command
> must satisfy the following constraint:
> areCompatibleTuples!(typeof(this), R, "=")
>
> which is totally unreasonable. And yet D insists. I guess there is an
> explanation, but mostly this seems like a bug.
>
The issue is that it's not EXACTLY a Tuple, because it's a derived type.
So it fails isTuple (In fact, I think the compiler just isn't smart
enough to detect that it can be implicitly converted to a Tuple).
But that defeats a lot of wrapping mechanisms, which I think is unnecessary.
I think there should probably be an overload:
opAssign(Tuple t) {expand = t.expand;}
that trumps the template one. That should I think take care of it.
Please file an issue.
-Steve
More information about the Digitalmars-d-learn
mailing list