Understanding opAssign and 'alias this'

Maurice m-ou.se at m-ou.se
Mon Oct 14 03:54:30 PDT 2013


On Monday, 14 October 2013 at 10:45:26 UTC, Maurice wrote:
> On Monday, 14 October 2013 at 09:32:15 UTC, Maxim Fomin wrote:
>> On Monday, 14 October 2013 at 09:17:12 UTC, John Colvin wrote:
>>> Everything is working fine except for the error on [2] when 
>>> xxx == true, which I think is a bug.
>>>
>>> minimised test:
>>>
>>> struct A
>>> {
>>>       void opAssign(A a) {}
>>> }
>>>
>>> struct B {
>>>       A a;
>>>       alias a this;
>>> }
>>>
>>> void main() {
>>>       A a;
>>>       B b;
>>>       b = a;
>>> }
>>>
>>> Error: function assign.B.opAssign (B p) is not callable using 
>>> argument types (A)
>>
>> This does not work (and need not) because compiler generates 
>> default function B.opAssign(B) which is really not callable 
>> using argument types (A).
>
> Then why does it work when replacing "opAssign(A a)" with 
> "opAssign(int)"?
>
> struct A {
>         void opAssign(int) {}
> }
>
> struct B {
>         A a;
>         alias a this;
> }
>
> void main() {
>         A a;
>         B b;
>         b = a; // This now compiles fine...
> }

Or when just not defining any opAssign: struct A {}, that also 
works. I don't get how adding a opAssign(A) disables 'b = a'.


More information about the Digitalmars-d-learn mailing list