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

时间:2016-06-08 20:55:11

标签: d

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

错误:无法隐式转换表达式(((Array!int __slArray2557 = Array(RefCounted(RefCountedStore(null));;),_ _ slArray2557).this([1,2,3]))类型为Array!int to不可改变的(阵列!INT)

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

似乎我可以将一个可变对象强制转换为不可变对象

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

为什么我必须将其投射到immutable

是不可变的甚至是合法的?

1 个答案:

答案 0 :(得分:6)

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

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

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

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

BTW auto中的immutable auto是不必要的,您可以将其称为immutable

你也可以创建一个可变数据的可变数组,它也应该工作 - 由于它的内存管理方案,它只需要可变性。