Является ли "static if" в D декларативным или процедурным?

Рассмотрим следующий код:

static if (!is(MyStruct))
{
    struct MyStruct
    {
    }
}

static if (is(MyStruct))
{
    static assert(0);
}

Я изначально считал, что порядок объявлений (в глобальной области видимости) не имеет значения в D.

Однако в данном случае порядок статических ifов делает разницу между тем, компилируется программа или нет.

Таким образом, является ли этап оценки во время компиляции в D процедурной особенностью (как в C/C++), декларативной особенностью или чем-то другим? Каким он является в настоящее время, и каким он планируется быть (если эти два варианта отличаются)?


Edit:

Я только что понял, что проблема даже не заканчивается здесь. Что произойдет, если static if использует .tupleof для перечисления членов текущего модуля и создаст проблему того же типа?

5
задан Mechanical snail 22 August 2012 в 20:49
поделиться