This can help confuse your mind a bit: import std.stdio: writeln; void main() { { int[] arr = [0, 1, 2, 3, 4, 5, 6].dup; int[] slice = arr[2 .. 4]; writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 4 5 6 | 2 3 slice ~= 10; slice ~= 20; writeln("arr.capacity, slice.capacity: ", arr.capacity, " ", slice.capacity); // arr.capacity, slice.capacity: 7 7 writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 4 5 6 | 2 3 10 20 }
{ int[] arr = [0, 1, 2, 3, 4, 5, 6].dup; int[] slice = arr[2 .. 4]; writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 4 5 6 | 2 3 slice.assumeSafeAppend; slice ~= 10; slice ~= 20; // causes stomping writeln("arr.capacity, slice.capacity: ", arr.capacity, " ", slice.capacity); // arr.capacity, slice.capacity: 0 5 writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 10 20 6 | 2 3 10 20 slice ~= 30; slice ~= 40; writeln("arr.capacity, slice.capacity: ", arr.capacity, " ", slice.capacity); // arr.capacity, slice.capacity: 7 7 writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 10 20 30 | 2 3 10 20 30 40 } } The slice.capacity = 7 in the first case is just a coincidence, it's the result of the overallocation. But I don't know why arr.capacity is zero and then seven in the second and third case. Bye, bearophile