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...

Reply via email to