char[]
отличает от const char[]
неявно. Никакой бросок не требуется.
auto foo(const char[]) {...}
auto foo(const(char)[]) {...}
оба принимают любые изменения изменчивости char[]
- char[]
, const(char)[]
, immutable(char)[]
, const char[]
и immutable char[]
. Оба mutable и immutable
неявно конвертируют в const
в целом.
EDIT (добавление после кода добавляется к вопросу):
На самом деле, я в шоке, что ваша вторая строка компилирует. Это не имеет никакого отношения к const
vs mutable. Это связано с временем компиляции и временем выполнения. Строки, которые вы передаете в mixin
, должны быть известны во время компиляции. Обычно это означает использование функции для возврата строки (в этом случае она называется частью CTFE) или с использованием перечисления (которое было бы известно во время компиляции). Переменные не известны во время компиляции и поэтому обычно не могут использоваться. Тем не менее, вам повезло с вашей версией const
, потому что компилятор знал, что значение никогда не изменится, и значение было напрямую инициализировано, поэтому оно знало, что это было, и это позволяет вам уйти от него. Если вы имели
const char[] tab2 = foo();
и foo
возвратил строку, которую хотел использовать, что mixin
не смогли бы собрать так же, как первый на.
Строки для миксинов должны либо непосредственно передаваться в смеситель, возвращенные из функции (которая называется частью CTFE), либо быть перечислением.
Если вы хотите поместить содержимое файла в mixin
, вам необходимо использовать импорт строки. например
mixin(import("foo.txt"));
И вы должны сообщить компилятору, что каталог, чтобы найти foo.txt в использовании -J
флага.
Ответ Джонатана приведен ниже. Вы можете узнать об этом подробнее, http://ddili.org/ders/d.en/const_and_immutable.html – yaz