struct and default constructor

via Digitalmars-d digitalmars-d at puremagic.com
Fri Oct 10 02:14:14 PDT 2014


On Friday, 10 October 2014 at 01:32:54 UTC, dcrepid wrote:
> On Sunday, 27 November 2011 at 19:50:24 UTC, deadalnix wrote:
>> Hi,
>>
>> I wonder why struct can't have a default constructor...
>
> I know this is an old thread, but I've run into this same 
> problem recently and search yielded this result.
>
> I myself have tried working around the default-constructor 
> problem with things like
>
> this(bool bInit = true)
>
> - which of course doesn't get invoked with MyStruct(), even 
> with @disable this.

You can use `static opCall` as a workaround. The following prints 
"S(0)" and "S(3)":

     struct S {
         int x;
         static S opCall() {
             S s;
             s.x = 3;
             return s;
         }
     }

     void main() {
         import std.stdio;
         S s;
         writeln(s);
         S t = S();
         writeln(t);
     }

But if you add a constructor with parameters, you get an error:

     struct S {
         int x;
         static S opCall() { ... }
         this(int y) { x = y; }
     }

xx.d(4): Error: struct xx.S static opCall is hidden by 
constructors and can never be called
xx.d(4):        Please use a factory method instead, or replace 
all constructors with static opCall.

IMO this is too restrictive, as obviously, the static opCall is 
_not_ hidden by the constructor.


More information about the Digitalmars-d mailing list