www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Static assert triggered in struct constructor that shouldn't be called

reply jmh530 <john.michael.hall gmail.com> writes:
The following code results in the static assert in the 
constructor being triggered, even though I would have thought no 
constructor would have been called. I know that there is an easy 
fix for this (move the static if outside the constructor), but it 
still seems like it doesn't make sense.

enum Foo
{
     A,
     B,
}

struct Bar(Foo foo)
{
     static if (foo == Foo.A)
     {
         float x = 0.5;
         long y = 1;
     }
     else static if (foo == Foo.B)
     {
         int p = 1;
     }

     this(long exp, float x)
     {
         static if (foo == Foo.A) {
             this.y = exp;
             this.x = x;
         } else {
             static assert(0, "Not implemented");
         }
     }
}

void main()
{
     Bar!(Foo.B) x;
}
May 24 2020
next sibling parent reply "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Sun, May 24, 2020 at 09:34:53PM +0000, jmh530 via Digitalmars-d-learn wrote:
 The following code results in the static assert in the constructor
 being triggered, even though I would have thought no constructor would
 have been called. I know that there is an easy fix for this (move the
 static if outside the constructor), but it still seems like it doesn't
 make sense.
[...] The problem is that static assert triggers when the function is compiled (not when it's called), and since your ctor is not a template function, it will always be compiled. Hence the static assert will always trigger. T -- The trouble with TCP jokes is that it's like hearing the same joke over and over.
May 24 2020
parent jmh530 <john.michael.hall gmail.com> writes:
On Sunday, 24 May 2020 at 21:43:34 UTC, H. S. Teoh wrote:
 On Sun, May 24, 2020 at 09:34:53PM +0000, jmh530 via 
 Digitalmars-d-learn wrote:
 The following code results in the static assert in the 
 constructor being triggered, even though I would have thought 
 no constructor would have been called. I know that there is an 
 easy fix for this (move the static if outside the 
 constructor), but it still seems like it doesn't make sense.
[...] The problem is that static assert triggers when the function is compiled (not when it's called), and since your ctor is not a template function, it will always be compiled. Hence the static assert will always trigger. T
Thanks. Makes sense.
May 24 2020
prev sibling parent Adam D. Ruppe <destructionator gmail.com> writes:
On Sunday, 24 May 2020 at 21:34:53 UTC, jmh530 wrote:
 The following code results in the static assert in the 
 constructor being triggered, even though I would have thought 
 no constructor would have been called.
static assert is triggered when the code is *compiled*, whether it is actually run or not. So as long s the function exists, its static asserts must all pass before it even gets to the runtime decision of if it is actually called or no.
May 24 2020