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
?
是不可变的甚至是合法的?
答案 0 :(得分:6)
由于Array
是引用计数,它现在与不可变权不兼容 - 它保留一个指向其中的引用计数的指针,如果它是不可变的则不会改变,从而破坏整个事物。演员只是绕过规则,这些规则编译但是未定义的行为。
如果它是不可变的,只需抛弃Array
包装器并使用普通切片:
// this works fine
immutable a = [1, 2, 3];
(哎呀,如果你传递一个文字,那么数组包装器基本没用,因为普通数组的构造只是为了传递给它的构造函数,然后再次构造它!)
BTW auto
中的immutable auto
是不必要的,您可以将其称为immutable
。
你也可以创建一个可变数据的可变数组,它也应该工作 - 由于它的内存管理方案,它只需要可变性。