Would love to override default ctor of struct

aliak something at something.com
Tue Jan 22 01:18:24 UTC 2019


On Monday, 21 January 2019 at 20:50:45 UTC, Meta wrote:
> On Monday, 21 January 2019 at 19:08:49 UTC, Alex wrote:
>> Could you give an example, where a zero argument construction 
>> has to be done, which cannot be accomplished by setting the 
>> appropriate field with a default value?
>
> For the following reason, although the default argument 
> constructor hack no longer works:
>
> import std.stdio;
>
> struct Test(bool useFieldDefaultVal)
> {
>     static if (useFieldDefaultVal)
>     {
>         int[] arr = [1, 2, 3];
>     }
>     else
>     {
>         int[] arr;
>
>         this(int dummy = 0)
>         {
>             arr = [1, 2, 3];
>         }
>     }
>
>     void doTest()
>     {
>     	writeln("Address of arr: ", arr.ptr);
>     }
> }
>
> void main()
> {
>     Test!true t1;
>     Test!true t2;
>
>     // Deprecation: constructor `onlineapp.Test!false.Test.this`
>     // all parameters have default arguments, but structs cannot
>     // have default constructors.
>     auto t3 = Test!false();
>
>     t1.doTest(); // Prints "Address of arr: 5622DAA0F010"
>     t2.doTest(); // Prints "Address of arr: 5622DAA0F010"
>     t3.doTest(); // Prints "Address of arr: null"
> }

Ok, so this confused me a bit, I seem to remember that when you 
static inisialize a class in the declaration scope of a struct, 
the same thing would happen as with arrays, i.e. they'd have the 
same address. But this turned out different:

import std.stdio;

class C {}

struct Test(bool useFieldDefaultVal)
{
     static if (useFieldDefaultVal)
     {
         C c = new C;
     }
     else
     {
         C c;

         this(int dummy = 0)
         {
             c = new C;
         }
     }

     void doTest()
     {
     	writeln("Address of c: ", &c);
     }
}

void main()
{
     Test!true t1;
     Test!true t2;

     // Deprecation: constructor `onlineapp.Test!false.Test.this`
     // all parameters have default arguments, but structs cannot
     // have default constructors.
     auto t3 = Test!false();

     t1.doTest(); // Prints "Address of arr: 7FFE1322A7E8"
     t2.doTest(); // Prints "Address of arr: 7FFE1322A7F0"
     t3.doTest(); // Prints "Address of arr: 7FFE1322A7F8"
}

t1 and t2 have different addresses and t3 has t1's address?? Huh?

Vat Khappened Khere?


More information about the Digitalmars-d mailing list