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