On Saturday, 9 January 2021 at 02:07:50 UTC, Ali Çehreli wrote:
On 1/8/21 3:10 PM, tsbockman wrote:
> On Friday, 8 January 2021 at 20:43:37 UTC, Andrey wrote:
>> Hello,
>>
>>> struct Value
>>> {
>>> int value;
>>> string data;
>>> string[] text;
The destination is immutable(char)[]. The characters cannot be
changed. We can still append but other slices that share the
same data is protected by D's no-stomp decision.
>>> }
>>>
>>> void test(const ref Value value)
>>> {
>>> Value other = void;
>>> other.text = value.text;
Even though the source is 'const ref', other.text is a copy of
the slice object (the pointer and the length). Because the
elements are immutable, other.text cannot mutate value.text.
Remember, `string[]` means `immutable(char)[][]`, so there are
actually two layers of pointer + length here. The outer one is
copied, but the inner one is not, which means that mutating
`other.text[0]` would also mutate `value.text[0]` if this
assignment were allowed.