我正在阅读文档,并且在语言的一些设计决策中不断摇头。但是,真正让我感到困惑的是如何处理数组。
我冲到操场上,尝试了一下。您也可以尝试。所以第一个例子:
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
这里a
和b
都是[1, 42, 3]
,我都可以接受。引用了数组-确定!
现在看这个例子:
var c = [1, 2, 3]
var d = c
c.append(42)
c
d
c
是[1, 2, 3, 42]
BUT d
的[1, 2, 3]
。也就是说,d
在上一个示例中看到了更改,但在此示例中没有看到它。文档说那是因为长度改变了。
现在,这个呢?
var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f
e
是[4, 5, 3]
,这很酷。可以进行多索引替换,但是f
即使长度没有变化,STILL也看不到变化。
综上所述,如果更改1个元素,则对数组的公共引用会发生更改,但是如果更改多个元素或附加项,则会创建一个副本。
对我来说,这似乎是一个非常糟糕的设计。我是这样想的吗?有没有我看不出为什么数组应该这样工作的原因?
编辑:数组已更改,现在具有值语义。更加理智!
std::shared_ptr
没有非原子版本时,有一个基于事实而不是观点的答案(事实是委员会考虑了它,但出于各种原因而不希望它)。