Thread overview
Static assert triggered in struct constructor that shouldn't be called
May 24, 2020
jmh530
May 24, 2020
H. S. Teoh
May 24, 2020
jmh530
May 24, 2020
Adam D. Ruppe
May 24, 2020
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
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
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
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.