| |
| Posted by Anton Pastukhov in reply to Jonathan M Davis | PermalinkReply |
|
Anton Pastukhov
Posted in reply to Jonathan M Davis
| On Wednesday, 23 October 2024 at 19:10:05 UTC, Jonathan M Davis wrote:
> On Wednesday, October 23, 2024 11:18:47 AM MDT Anton Pastukhov via Digitalmars-d-learn wrote:
>> On Wednesday, 23 October 2024 at 14:50:44 UTC, Paul Backus wrote:
>> > On Wednesday, 23 October 2024 at 12:46:24 UTC, Paul Backus wrote:
>> >
>> > You can't use an `alias` to refer to a member variable like this. When you write
>> >
>> > alias myAlias = myStruct.test;
>> >
>> > ...it is silently rewritten by the compiler to
>> >
>> > alias myAlias = MyStruct.test;
>> >
>> > So, in reality, there is no difference between the two versions.
>>
>> Is it intended behavior? Is it documented somewhere? I'm looking here https://dlang.org/spec/declaration.html#alias and it states: "An AliasDeclaration creates a symbol name that refers to a type or another symbol". `myStruct.test` is a symbol.
>
> It aliases the symbol, but a member function does you no good without an object to go with it. For the alias of a member function to actually be properly callable, it would need more than just the symbol. It would actually need to reference the object itself in some fashion, and that's simply not how aliases work. All they really do is provide an alternate name for a symbol.
>
> Really, it should probably just be illegal to alias a member function from a variable rather than the type, because the fact that it's allowed and then treated like it's an alias from the type causes confusion like you're experiencing. However, it's likely allowed for similar reasons to why it's legal to call static member functions on an instance rather than requiring that they be called on the type (which I'm inclined to argue was a bad design decision, but it's what we have).
>
> - Jonathan M Davis
Thanks for the clarification. I understand that aliasing a delegate would be problematic because it's context-aware. In my case, however, I'm aliasing not a delegate and not even a free function, I'm aliasing a struct field of enum type, which holds no references to the context. In my book it should be perfectly ok and inability to do so looks like a bug for me. Other participants mentioned that there is some rationale behind that design, so I'm just trying to understand it before heading to Bugzilla
|