Это становится сложным. Это по сути декларативно, но порядок все еще может иметь значение, когда static if
вводит новый символ. Кроме того, я не верю, что это когда-либо имеет значение, но, как показывает ваш пример, когда вы вводите новый символ в static if
, а другой static if
использует его, порядок определенно может иметь значение.
В последнее время обсуждается о том, как сделать его максимально последовательным и интуитивно понятным. Так что, особенно в угловых случаях, ситуация может измениться в ближайшее время. Но я ожидаю, что ваш пример продолжит вызывать static assert
. Вопрос в том, начнет ли он запускать static assert
, если вы измените порядок блоков static if
, и я не уверен, что это действительно было решено. Обсуждение по этому вопросу в группе новостей компилятора не совсем убедительно, и имхо трудно следовать ИМХО, поэтому я не могу сказать наверняка. Но я ожидаю, что порядок все равно будет иметь значение, по крайней мере, в некоторых случаях, когда в блоке static if
вводится новый символ.
EDIT:
Это было недавно опубликовано одним из основных участников dmd:
В настоящее время порядок оценки во время компиляции не определен; DMD
в настоящее время делает это неопределенно в лексическом порядке, но планируется
измениться в ближайшее время. 'static if' и 'mixin' будут оцениваться
в лексическом порядке, прежде чем что-либо еще будет сделано. После этого,
все остальное будет оцениваться по требованию.
Помимо прохода "static if / mixin", компиляция может продолжаться в
параллельный (хотя текущая реализация еще не делает этого), который
означает, что нет порядка (несколько элементов могут завершить компиляцию
одновременно).
Итак, надеюсь, это прояснит ситуацию.