为什么 D 中的定长 char 数组允许直接字符串赋值?

Why do fixed length char arrays in D allow direct string assignment?

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";

你能解释一下幕后发生的事情吗?

其实很简单:编译器知道字符串文字的大小,知道静态数组的大小,可以看出它们可以简单地复制过来,所以它做到了。然后因为它知道它是一个新副本,所以不需要应用不可变,因为它只适用于对原始文件的引用。

使用 char[] baba =,编译器不知道所有这些 - 在您的情况下,它试图将 reference 分配给原始字符串,这意味着 mutable/immutable 不匹配适用,因此它使您明确说明您想要一份副本。