UDAs and no complaints about "need 'this'"
jkpl via Digitalmars-d
digitalmars-d at puremagic.com
Thu Apr 9 05:09:17 PDT 2015
On Thursday, 9 April 2015 at 09:53:15 UTC, John Colvin wrote:
> struct BigLongStructName
> {
> int evenLongerMemberName;
> }
>
> struct QN{}
>
> unittest
> {
> BigLongStructName bigLongStructName;
>
> @(bigLongStructName.evenLongerMemberName)
> QN quickName;
>
> __traits(getAttributes, quickName)[0]++;
> }
>
> Is it just me or is it weird that this works? Once you pull the
> UDA out from being a storage class and attempt to alias it, you
> get the usual "need 'this' for 'evenLongerMemberName' of type
> 'int'" error messages on use.
>
> Why are UDAs so special? I don't believe there's any other way
> to achieve this sort of effective renaming.
I think it's an error. When the attribute is a struct, it looks
like the member is processed as a static variable. But the
equivalent with a class raises an AV:
---
class BigLongStructName
{
int evenLongerMemberName;
}
struct QN{}
unittest
{
import std.stdio;
BigLongStructName bigLongStructName;
@(bigLongStructName.evenLongerMemberName)
QN quickName;
__traits(getAttributes, quickName)[0]++;
}
---
which is a totally expected behaviour.
More information about the Digitalmars-d
mailing list