Проблема в том, что [1,2,3]
не является статическим массивом. Это динамический массив, поэтому он не может соответствовать. Это неправильный тип, и нет никакого способа иметь литерал статического массива. Если вы хотите передать литерал массива как статический массив, вам нужно либо сначала присвоить его переменной, либо привести его к нужному типу.
auto w = unit(cast(real[3])[1,2,3]);
должно работать. Лично я бы сказал, что лучше всего просто явно создать экземпляр шаблона
auto w = unit!3([1, 2, 3]);
потому что это исключает риск испортить гипс.
Теперь, я думаю, что есть определенный аргумент, что компилятор должен просто работать в этом случае, но он имеет тенденцию быть намного более требовательным к шаблонам, чем к обычным функциям, поскольку он обычно создает шаблоны с точным типом, который вы передаете без пытаясь сделать какие-либо неявные преобразования, тогда как нормальная функция неявно преобразует динамический массив в статический Не стесняйтесь открыть запрос на улучшение . Поведение может измениться. Это было недавно изменено, так что IFTI (неявная реализация шаблона функции) инстанцируется с хвостовой версией массива (например, immutable(char)[]
вместо immutable(char[])
), что является определенным улучшением. Теперь это немного отличается от попытки преобразования (я считаю, что компилятор просто автоматически всегда обрабатывает массивы как хвостовую константу для IFTI), поэтому я не знаю, что шансы на изменение поведения компилятора в этом случае очень велики высоко. Но спрашивать не больно.