static opCall not working?

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 20 02:04:20 PDT 2015


On Sunday, 19 July 2015 at 13:25:41 UTC, Ali Çehreli wrote:
> On 07/19/2015 03:26 AM, TC wrote:
>> I tested the code from: http://dlang.org/struct.html
>> Section: Dynamic Initialization of Structs
>>
>>
>> struct S
>> {
>>      int a;
>>
>>      static S opCall(int v)
>>      {
>>          S s;
>>          s.a = v;
>>          return s;
>>      }
>>
>>      static S opCall(S v)
>>      {
>>          S s;
>>          s.a = v.a + 1;
>>          return s;
>>      }
>> }
>>
>> S s = 3; // sets s.a to 3
>> S t = s; // sets t.a to 3, S.opCall(s) is not called
>>
>> which does not compile (Error: cannot implicitly convert 
>> expression (3)
>> of type int to S).
>>
>> What is wrong here? Docs or behavior? Tested it on 
>> asm.dlang.org where
>> it fails with all compiler versions.
>
> The docs are not clear: s and t are not meant to be 
> module-scope variables, which should be initialized in a 
> 'static this()' (or 'shared static this()'). Put them inside a 
> function like main() and it works fine.

I think that's not what the OP means. The documentation is indeed 
saying that a struct with static opCall() can be used to 
_construct_ the structure, with exactly this syntax, i.e. not 
with `S a = S(3);`, but with `S a = 3;`. I, too, find this very 
surprising. opCall() is not a constructor...


More information about the Digitalmars-d-learn mailing list