Почему массивы символов фиксированной длины в D позволяют прямое назначение строк? - PullRequest
0 голосов
/ 19 октября 2019

Строки в D - это просто неизменяемые массивы символов. Например.

immutable(char[]) baba = "Baba Yaga";

такой, что попытка что-то вроде

char[] baba = "Baba Yaga"; // ERROR!

вызовет исключение Error: cannot implicitly convert expression "Baba Yaga" of type string to char[]. Сначала вам нужно скопировать строку, используя ее свойство .dup.

char[] baba = "Baba Yaga".dup;

Однако, почему работает следующее?

char[9] baba = "Baba Yaga";

Не могли бы вы объяснить, что происходит засцены

1 Ответ

3 голосов
/ 19 октября 2019

На самом деле все довольно просто: компилятор знает размер строкового литерала, знает размер статического массива и может видеть, что их можно просто скопировать, что он и делает. Кроме того, поскольку он знает, что это новая копия, его нельзя изменять, поскольку он применяется только к ссылкам на оригинал.

При char[] baba = компилятор не знает всего этого - в вашем случае он пытаетсяназначить ссылку на исходную строку, что означает, что применяется изменяемое / неизменяемое несоответствие, поэтому вы явно указываете, что хотели получить копию.

...