创建用户定义的不可变对象

Creating user defined immutable objects

  immutable auto a = Array!int([1, 2, 3]);

Error: cannot implicitly convert expression (((Array!int __slArray2557 = Array(RefCounted(RefCountedStore(null)));) , __slArray2557).this([1, 2, 3])) of type Array!int to immutable(Array!int)

通常我只是想在运行时创建一些对象,初始化它然后使它不可变但是如果我尝试这样做,我会从上面得到错误。

看来我可以将可变对象转换为不可变对象

  immutable auto a = cast(immutable Array!int) Array!int([1, 2, 3]);

为什么我必须将其转换为 immutable

强制转换为不可变是否合法?

由于 Array 是引用计数的,它现在与不可变不兼容 - 它在其中保留一个指向引用计数的指针,如果它是不可变的,则不能更改,从而破坏了整个事情。转换只是绕过规则,编译但未定义行为。

如果它是不可变的,只需放弃 Array 包装器并使用普通切片:

// this works fine
immutable a = [1, 2, 3];

(哎呀,如果你传递一个文字,数组包装器基本上是无用的,因为构造普通数组只是为了传递给它的构造函数,在那里它再次构造!)

顺便说一句,immutable auto 中的 auto 是不必要的,您可以直接调用它 immutable

您还可以制作一个由不可变数据组成的可变数组,它应该也能工作——它只需要可变性,因为它的内存管理方案。